2012-10-05 35 views
18

Decidí usar la tarea Zip de MSBuild Extension para comprimir parte de mi código fuente en cada compilación.¿Cómo usar la tarea Zip de la extensión MSBuild?

Sin embargo, esto no funciona:

<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> 

Tengo el siguiente mensaje de error:

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.

No sé lo que hace que este error? ¿Alguna idea?

+0

¿Tiene * que ser el paquete de extensión de MSBuild? Nunca lo usé, pero podría darle un ejemplo de trabajo para [MSBuild Community Tasks] (https://github.com/loresoft/msbuildtasks) en su lugar. –

+0

No tiene que ser este paquete. Solo tiene que comprimir los archivos correctamente :) – Zsolt

Respuesta

32

Ejemplo para 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> 

Si necesita más ejemplos, here is a complete working MSBuild file de uno de mis proyectos.

+0

¡Gracias! ¡Funcionó bien! – Zsolt

+0

Realmente me gusta el diseño físico de ese proyecto. He estado trabajando con .NET durante años y nunca pensé en hacer nada diferente de la configuración de VS predeterminada. Estaremos revolviendo por aquí para encontrar formas de estructurar proyectos futuros. Definitivamente cambia mi forma de ver las cosas. –

+0

¿Qué significa exactamente en mi diseño que sea tan especial? Todos mis proyectos privados se parecen a esto, pero honestamente ... hasta ahora no consideraba que nada sobre el diseño de mi proyecto típico fuera "especial". –

4

Aquí hay una alternativa al MSBuild Community Tasks. Si está utilizando .net 4.5.1, puede incrustar las funciones System.IO.Compression en un UsingTask. Este ejemplo usa 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> 
Cuestiones relacionadas