使用MSBuild压缩多个项目目录

4
作为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并枚举我想要压缩的项目。

在NAnt中,通过其foreach任务,这个任务很容易完成,但是如何在MSBuild中实现呢?最好不要使用自定义任务。

2个回答

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等的文件。


0

这很可能是因为本地的 .Net 框架 zip 功能无法处理嵌套文件夹,只能处理文件 - 如果您使用的任务使用了此功能,则将无法成功。

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

如果这样还不行,请尝试使用 MSBuild 扩展任务 中的 Zip 任务,它可以满足您的需求。(这里是文档)。


很遗憾,MSBuild扩展包中的Zip任务与.NET 4不兼容(正在进行编写替代方案的工作,但尚未可用)。 - David Keaveny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接