2012-10-05 23 views
18

Tôi quyết định sử dụng tác vụ Zip của MSBuild Extension để nén một số mã nguồn của tôi ở mọi bản dựng.Cách sử dụng tác vụ Zip của MSBuild extension?

Tuy nhiên, đây không phải tác phẩm:

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

tôi nhận được thông báo lỗi sau:

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.

Tôi không biết những gì gây ra lỗi này? Bất kỳ ý tưởng?

+0

Có * có * là Gói mở rộng MSBuild không? Tôi không bao giờ sử dụng nó, nhưng tôi có thể cung cấp cho bạn một ví dụ làm việc cho [MSBuild Community Tasks] (https://github.com/loresoft/msbuildtasks) để thay thế. –

+0

Nó không phải là gói này. Nó chỉ cần zip các tập tin một cách chính xác :) – Zsolt

Trả lời

32

Ví dụ cho 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> 

Nếu bạn cần thêm ví dụ, here is a complete working MSBuild file từ một trong những dự án của tôi.

+0

Cảm ơn! Nó hoạt động tốt! – Zsolt

+0

Thực sự thích bố cục vật lý của dự án đó. Đã làm việc với .NET trong nhiều năm và không bao giờ nghĩ làm bất cứ điều gì khác với thiết lập VS mặc định. Sẽ hoàn toàn lục lọi qua đây để tìm cách cấu trúc các dự án trong tương lai. Chắc chắn thay đổi cách nhìn của tôi về mọi thứ. –

+0

Chính xác trong bố cục của tôi, điều đó có ý nghĩa gì? Tất cả các dự án tư nhân của tôi trông giống như thế này, nhưng thành thật mà nói ... cho đến bây giờ tôi không xem xét bất cứ điều gì về cách bố trí điển hình của tôi "đặc biệt". –

4

Đây là giải pháp thay thế cho MSBuild Community Tasks. Nếu bạn đang sử dụng .net 4.5.1, bạn có thể nhúng các hàm System.IO.Compression vào một số UsingTask. Ví dụ này sử dụng 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> 
Các vấn đề liên quan