2010-08-16 41 views
4

正如MSBuild的4.0我的生成過程的一部分,我結束了以下目錄結構:使用的MSBuild拉上了多個項目目錄

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

我希望能夠創造每子目錄一個zip文件\OutDir。如果我做到以下幾點:

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

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

那麼每個子文件夾遞歸地壓縮了,工作正常的項目A和項目C,但項目B兩個zip文件,它的根級別之一,其子文件夾的一個結束。

我的另一個要求是,項目的數量不受構建文件已知的,所以我不能只是創建的ItemGroup和枚舉,我想壓縮了項目。

這個任務是通過其的foreach任務容易惡性,但我怎麼能做到這一點的MSBuild,最好不訴諸自定義任務?

回答

3

我想出了一個解決方法 - MSBuild擴展包的FileUnder任務的組合,枚舉我想壓縮的ProjectX文件夾,以及調用7Zip的Exec任務。該代碼是:

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

所以,現在每個zip文件的內容從(以及配置和版本詳細信息)傳來的文件夾命名,所以我會在我的名爲項目A-調試 - 輸出文件夾中的文件0.1.2.345.zip等

0

這將很可能是因爲本地.NET框架壓縮功能不能做嵌套文件夾,只有文件 - 如果任務使用的是使用這個功能,那麼你就倒黴。

而且你對ZipSource Include="\OutDir\**.*"語法是稍有不妥,請嘗試使用<ZipSource Include="\OutDir\**\*.*"代替。

如果還是不行,請嘗試使用郵編任務從MSBuild Extension tasks,它確實你需要什麼。 (Here is the doco)。

+0

不幸的是從MSBuild擴展包的拉鍊任務不是與.NET 4兼容(工作正在進行中寫的替代品,但它尚未公佈)。 – 2010-08-16 23:02:19