作为我在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中实现这一点,最好不要求助于自定义任务?
答案 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为它)。