2012-10-05 7 views
18

Ich entschied mich, die Zip-Aufgabe von MSBuild Extension zu verwenden, um bei jedem Build etwas von meinem Quellcode zu komprimieren. JedochWie wird die Zip-Aufgabe der MSBuild-Erweiterung verwendet?

, das nicht funktioniert:

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

Ich habe die folgende Fehlermeldung:

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.

Ich weiß nicht, was diesen Fehler verursacht? Irgendeine Idee?

+0

Muss * das * MSBuild Extension Pack sein? Ich habe das nie benutzt, aber ich könnte Ihnen stattdessen ein funktionierendes Beispiel für [MSBuild Community Tasks] (https://github.com/loresoft/msbuildtasks) geben. –

+0

Es muss nicht dieses Paket sein. Es muss nur die Dateien richtig zippen :) – Zsolt

Antwort

32

Beispiel für 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> 

Wenn Sie weitere Beispiele benötigen, here is a complete working MSBuild file von einem meiner Projekte.

+0

Danke! Es hat gut funktioniert! – Zsolt

+0

Wirklich mag das physische Layout des Projekts. Arbeite seit Jahren mit .NET und dachte nie, etwas anderes als das Standard-VS-Setup zu tun. Werde hier unbedingt nach Wegen suchen, um zukünftige Projekte zu strukturieren. Ändert definitiv meine Sichtweise. –

+0

Was genau in meinem Layout meinst du, das ist so besonders? All meine privaten Projekte sehen dem ähnlich, aber ehrlich gesagt ... bis jetzt habe ich mir nichts über mein typisches Projektlayout "besonders" gedacht. –

4

Hier ist eine Alternative zu MSBuild Community Tasks. Wenn Sie .net 4.5.1 verwenden, können Sie die System.IO.Compression Funktionen in eine UsingTask einbetten. In diesem Beispiel wird ZipFile.CreateFromDirectory verwendet.

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