2012-10-05 10 views
18

Ho deciso di utilizzare l'attività Zip di MSBuild Extension per comprimere parte del mio codice sorgente ad ogni build.Come utilizzare l'attività Zip dell'estensione di MSBuild?

Tuttavia, questo non funziona:

<UsingTask TaskName="MSBuild.ExtensionPack.Compression.Zip" AssemblyFile="MSBuild.ExtensionPack.dll" /> 
<Target Name="AfterBuild"> 
    <CallTarget Targets="ZipSourceFiles" /> 
</Target> 
<Target Name="ZipSourceFiles" Condition="'$(ConfigTransform)'=='ImRunningOnTheServer'"> 
    <MSBuild.ExtensionPack.Compression.Zip TaskAction="Create" CompressFiles="c:\source.txt" ZipFileName="C:\target.zip"/> 
</Target> 

ho ottenuto il seguente messaggio di errore:

The "MSBuild.ExtensionPack.Compression.Zip" task was not found. Check the following: 1.) The name of the task in the project file is the same as the name of the task class. 2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "c:\Windows\Microsoft.NET\Framework\v4.0.30319" directory.

Non so che cosa provoca questo errore? Qualche idea?

+0

Ha * essere * il pacchetto di estensione MSBuild? Non l'ho mai usato, ma potrei darti un esempio funzionante per [MSBuild Community Tasks] (https://github.com/loresoft/msbuildtasks). –

+0

Non deve essere questo pacchetto. Basta solo comprimere i file correttamente :) – Zsolt

risposta

32

Esempio per MSBuild Community Tasks:

<Import Project="lib\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> 

<Target Name="Zip"> 
     <CreateItem Include="YourSourceFolder\*.*" > 
       <Output ItemName="ZipFiles" TaskParameter="Include"/> 
     </CreateItem> 
     <Zip ZipFileName="YourZipFile.zip" WorkingDirectory="YourSourceFolder" Files="@(ZipFiles)" /> 
</Target> 

Se avete bisogno di più esempi, here is a complete working MSBuild file da uno dei miei progetti.

+0

Grazie! Ha funzionato bene! – Zsolt

+0

Piace molto alla struttura fisica di quel progetto. Ho lavorato con .NET per anni e non ho mai pensato di fare qualcosa di diverso dall'impostazione VS predefinita. Sarà assolutamente rovistando qui per modi di strutturare i progetti futuri. Sicuramente cambia il mio modo di guardare alle cose. –

+0

Che cosa esattamente nel mio layout intendi che sia così speciale? Tutti i miei progetti privati ​​sono simili a questo, ma onestamente ... fino ad ora non ho considerato nulla del mio tipico layout di progetto "speciale". –

4

Ecco un'alternativa a MSBuild Community Tasks. Se si utilizza .net 4.5.1, è possibile incorporare le funzioni in un UsingTask. Questo esempio utilizza ZipFile.CreateFromDirectory.

<Target Name="Build"> 
    <ZipDir 
    ZipFileName="MyZipFileName.zip" 
    DirectoryName="MyDirectory" 
    /> 
</Target> 

<UsingTask TaskName="ZipDir" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll"> 
    <ParameterGroup> 
    <ZipFileName ParameterType="System.String" Required="true" /> 
    <DirectoryName ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
    <Reference Include="System.IO.Compression.FileSystem" /> 
    <Using Namespace="System.IO.Compression" /> 
    <Code Type="Fragment" Language="cs"><![CDATA[ 
     try 
     { 
     Log.LogMessage(string.Format("Zipping Directory {0} to {1}", DirectoryName, ZipFileName)); 
     ZipFile.CreateFromDirectory(DirectoryName, ZipFileName); 
     return true; 
     } 
     catch(Exception ex) 
     { 
     Log.LogErrorFromException(ex); 
     return false; 
     } 
    ]]></Code> 
    </Task> 
</UsingTask> 
Problemi correlati