使用MSBuild压缩多个项目目录

时间:2010-08-16 07:27:06

标签: .net msbuild build-automation

作为我在MSBuild 4.0中构建过程的一部分,我最终得到了以下目录结构:

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

我希望能够为\OutDir的每个子文件夹创建一个zip文件。如果我执行以下操作:

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

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

然后递归压缩每个子文件夹,这适用于ProjectA和ProjectC,但ProjectB最终有两个zip文件,一个根级别和一个子文件夹。

我的另一个要求是构建文件不知道项目的数量,所以我不能只创建一个ItemGroup并枚举我想要压缩的项目。

通过foreach任务,这项任务在NAnt中很容易,但我怎样才能在MSBuild中实现这一点,最好不要求助于自定义任务?

2 个答案:

答案 0 :(得分: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 %22@(WebsiteFolders)\*%22" />

所以现在每个zip文件都以其内容来自的文件夹(以及配置和版本控制细节)命名,因此我的输出文件夹中的文件名为ProjectA-Debug-0.1.2.345.zip等。< / p>

答案 1 :(得分:0)

这很可能是因为原生的.Net框架zip功能无法执行嵌套文件夹,只能执行文件 - 如果您使用的任务使用此功能,那么您将无法运气。

此外,您ZipSource Include="\OutDir\**.*"的语法略有错误,请尝试使用<ZipSource Include="\OutDir\**\*.*"

如果这不起作用,请尝试使用MSBuild Extension tasks中的Zip任务,它可以满足您的需求。 (Here is the doco为它)。