作为 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
我希望能够为每个子文件夹创建一个 zip 文件\OutDir
。如果我执行以下操作:
<ItemGroup>
<ZipSource Include="\OutDir\**.*" />
</ItemGroup>
<MSBuild.Community.Tasks.Zip
Files="@(ZipSource)"
ZipFileName="OutDir\%(ZipSource.RecursiveDir)ZippedOutput.zip"
WorkingDirectory="OutDir" />
然后每个子文件夹都会被递归压缩,这对于 ProjectS 和 Project 来说效果很好,但 Project 最终会得到两个 zip 文件,一个是其根文件夹,一个是其子文件夹。
我的另一个要求是构建文件不知道项目的数量,因此我不能只创建一个 ItemGroup 并枚举我想要压缩的项目。
在 NAnt 中通过其 foreach 任务可以很容易地完成此任务,但如何在 MSBuild 中实现此任务,最好不诉诸自定义任务?
我想出了一个解决方法 - 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 等的文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)