Comment puis-je écrire une tâche zip Albacore qui ne comprend que certains dossiers et les dossiers eux-mêmes?

StackOverflow https://stackoverflow.com/questions/3151887

  •  01-10-2019
  •  | 
  •  

Question

Je suis en train de zipper les artefacts d'une accumulation de râteau, en utilisant Albacore est ZipTask . La solution que je vais construire a trois projets qui ont des artefacts qui doivent être compressés individuellement, mais seulement le projet ASP.NET MVC sera mentionné ici. Voici la structure de répertoire de la solution:

rakefile.rb
solution.sln
src/
    (other projects that are not relevant)
    website/
        (various folders I don't want included in the artifacts)
        bin/
        Content/
        Scripts/
        Views/
        Default.aspx
        Global.asax
        web.config

Dans un premier temps j'ai écrit cette tâche:

website_directory = File.join '.', 'src', 'website'
website_project_name = 'website'

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip = [ 'bin', 'Content', 'Scripts', 'Views' ].map{ |folder| File.join website_directory, folder }
  zip.additional_files = [ 'Default.aspx', 'favicon.ico', 'Global.asax', 'web.config'].map{ |file| File.join website_directory, file }
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

Le problème est, la sortie de cette tâche est un fichier zip contenant les contenu de ces dossiers, et non pas les dossiers eux-mêmes, ce qui est évidemment indésirable.

Ensuite, j'ai essayé renversant le champ flatten_zip false (ce qui est un champ documenté mais vous pouvez le trouver dans source). Ce produit un zip contenant les dossiers ci-dessus, mais au fond de toute la hiérarchie des dossiers de ./src/website/. Je veux que les dossiers ci-dessus à la racine du zip, de sorte que travaille pas non plus.

Alors mon prochain coup est ce, en utilisant exclusions, qui est également pas documenté:

zip :zip => [ :run_unit_tests, :less ] do |zip|
  zip.directories_to_zip website_directory
  zip.exclusions = [ /.git/, /.+\.cs/, /App_Data/, /Attributes/, /AutoMapper/, /Controllers/, /Diagrams/, /Extensions/, /Filters/, /Helpers/, /Models/, /obj/, /Properties/, /StructureMap/, /Templates/, /CompTracker.Web.csproj/, /Default.aspx.cs/, /Global.asax.cs/, /Publish.xml/, /pdb/ ]
  zip.output_file = get_output_file_name
  zip.output_path = get_artifacts_output_path website_project_name
end

Cela a fonctionné pour moi, mais quand j'ai récemment ajouté /AutoMapper/ et /StructureMap/ au tableau de exclusions, elle a aussi causé AutoMapper.dll et StructureMap.dll à (bien sûr) être également exclu du dossier bin.

Comment dois-je modifier l'une des tâches ci-dessus pour avoir uniquement les dossiers et les fichiers que je veux à la racine de mon zip?

Était-ce utile?

La solution

Vous pouvez copier tous les fichiers et les dossiers dont vous avez besoin dans un répertoire temporaire puis zip vers le haut. En d'autres termes, définir la propriété directories_to_zip dans un dossier qui contient tous les fichiers corrects déjà copiés dans - où le Code copie est ce qui fait tout le filtrage pour vous. Je pense que l'utilisation est sans précision attendue (et la façon dont je l'utilise). Je vais juste contraster les deux idées pour le rendre clair.

Stratégie A: Copiez la structure du dossier

Copier ce dont vous avez besoin dans un répertoire temporaire. De cette façon, vous définissez le « directories_to_zip » propriété d'un dossier, par exemple:

directories_to_zip = 'ziptemp/all.my.stuff.copied.here/'

Stratégie B: Utiliser un filtre

(Ceci est votre stratégie actuelle)

Utilisez la propriété directories_to_zip comme un filtre sur un répertoire d'origine (il est un tableau qui prend plusieurs répertoires, de sorte que vous ne pourriez pas être blâmé pour assumer cela devrait fonctionner de cette façon). Vous utilisez ensuite diverses propriétés pour filtrer les fichiers / dossiers dont vous avez besoin.

Résolution possible

Pour résoudre votre problème, alors, vous pouvez adopter la stratégie A. En fait, à moins qu'il y ait des problèmes extraordinaires avec ce (PC lent, étonnamment faible sur l'espace disque), je l'aurais pensé que ce serait une façon un peu plus robuste d'aller à ce sujet parce que vous pouvez être sûr que ce que vous passer comme un éclair est exactement ce que vous copiez, ce qui peut être vérifié en vérifiant le répertoire ziptemp.

Par ailleurs, je peux être sûr que la stratégie A fonctionne parce que je l'utilise (avec germon) à des fichiers zip pour nos installateurs.

Autres conseils

J'ai eu le même problème en utilisant germon, je voulais zipper un dossier appelé « outils » (pas seulement le contenu), le stocker dans un dossier appelé « out » et nommez le zip « tools.zip ... de sorte qu'au lieu je cela;

require 'zip/zipfilesystem'

Zip::ZipFile::open("out/tools.zip", Zip::ZipFile::CREATE) { |z|
    Dir['{tools}/**/*'].each { |f|
        z.add(f, f)
    }
}

Je sais que la fin mais j'espère que cela aide quelqu'un.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top