2010-08-16 5 views
4

Dans le cadre de mon processus de construction dans MSBuild 4.0, je me retrouve avec la structure de répertoire suivant:En utilisant MSBuild à zip multiples répertoires de projet

\OutDir 
    \ProjectA 
     \File1.dll 
     \File2.dll 
     \File3.exe 
    \ProjectB 
     \Subfolder1 
     File4.html 
     \File5.dll 
     \File6.dll 
     \File7.exe 
    \ProjectC 
     \File8.dll 
     \File9.exe 

Je veux être en mesure de créer un fichier zip par sous-dossier de \OutDir. Si je fais ce qui suit:

<ItemGroup> 
    <ZipSource Include="\OutDir\**.*" /> 
</ItemGroup> 

<MSBuild.Community.Tasks.Zip 
    Files="@(ZipSource)" 
    ZipFileName="OutDir\%(ZipSource.RecursiveDir)ZippedOutput.zip" 
    WorkingDirectory="OutDir" /> 

puis chaque sous-dossier est récursive zippé, qui fonctionne très bien pour ProjectA et ProjectC, mais se termine ProjectB avec deux fichiers zip, un de ses racine et un de ses sous-dossier. Mon autre exigence est que le nombre de projets n'est pas connu par le fichier de construction, donc je ne peux pas simplement créer un ItemGroup et énumérer les projets que je veux zipper.

Cette tâche serait facile dans NAnt à travers sa tâche foreach, mais comment puis-je l'obtenir dans MSBuild, de préférence sans recourir à des tâches personnalisées?

Répondre

3

Je suis venu avec une solution de contournement - une combinaison de la tâche FileUnder du pack d'extension MSBuild, pour énumérer les dossiers ProjectX que je veux compresser, et la tâche Exec appelant 7Zip. Le code est:

<MSBuild.ExtensionPack.FileSystem.FindUnder 
    TaskAction="FindDirectories" 
    Path="$(WebOutputFolder)" 
    Recursive="False"> 
    <Output ItemName="WebsiteFolders" TaskParameter="FoundItems" /> 
</MSBuild.ExtensionPack.FileSystem.FindUnder> 

<Exec Command="7za.exe a -r %22$(OutDir)%(WebsiteFolders.Filename)-$(Configuration)-$(AssemblyFileVersion).zip%22 %[email protected](WebsiteFolders)\*%22" /> 

Alors maintenant, chaque fichier zip est nommé d'après le dossier de son contenu est venu de (ainsi que la configuration et les détails versioning), donc je vais avoir des fichiers dans mon dossier de sortie nommé ProjectA-Debug- 0.1.2.345.zip etc.

0

Cela sera probablement dû au fait que la fonctionnalité de zip .Net native ne peut pas faire de dossiers imbriqués, seulement des fichiers - si la tâche que vous utilisez utilise cette fonctionnalité, vous n'aurez pas de chance.

Votre syntaxe pour le ZipSource Include="\OutDir\**.*" est légèrement incorrecte, essayez plutôt <ZipSource Include="\OutDir\**\*.*".

Si cela ne fonctionne pas, essayez d'utiliser la tâche Zip du MSBuild Extension tasks, il fait ce dont vous avez besoin. (Here is the doco pour cela).

+0

Malheureusement, la tâche Zip du pack d'extension MSBuild n'est pas compatible avec .NET 4 (le travail est en cours pour écrire un remplacement, mais il n'est pas encore disponible). –

Questions connexes