MSBUILD脚本应该在构建后压缩解决方案中的所有程序集,但只获取一些DLL(在本地和TFS构建下)

时间:2015-01-11 21:50:36

标签: tfs msbuild tfs2013 msbuild-task msbuildcommunitytasks

我想设置我的VS解决方案,因此在构建结束时,可压缩文件被压缩以便于分发。这应该在本地构建或TFS构建下工作。其设置如下:

  • 有一个项目(称为MyApp.Packaging)不包含代码,只包含MSBUILD .targets脚本
  • 该项目引用了所有其他项目,因此最后构建(通过查看项目构建顺序确认)
  • 构建脚本包含以下内容以识别和压缩(使用MSBUILD社区任务' ZIP任务)将EXE和DLL分成两个不同的包(还有其他代码可以使用MSBUILD从version.txt文件中提取版本号社区任务 - 为清晰起见而省略)
<!-- Set package name and input/output folders -->
<PropertyGroup>
    <PackageName>MyAppService</PackageName>
    <BuildTargetFolder>$(TargetDir)</BuildTargetFolder>
    <PackageOutputFolder>$(OutDir)</PackageOutputFolder>
</PropertyGroup>

<!-- Set location of files -->
<ItemGroup>
    <MyAppBinaries Include="$(BuildTargetFolder)*.exe$(BuildTargetFolder)*.dll;" Exclude="$(BuildTargetFolder)MyApp.Packaging.dll" />
    <MyAppOtherFiles Include="$(SolutionDir)MyApp.Packaging\InstallService.bat;$(SolutionDir)MyApp.Packaging\UnInstallService.bat;$(BuildTargetFolder)MyApp.HostService.exe.config" />
    <MyAppContracts Include="$(BuildTargetFolder)MyApp.Common.DataContext.dll;$(BuildTargetFolder)MyApp.Common.Shared.dll" />
</ItemGroup>

<!-- After building (in Release mode only), build the installation package -->
<Target Name="AfterBuild">
    <CallTarget Targets="BuildPackage" Condition="'$(Configuration)'=='Release'" />
</Target>

<!-- Build the package -->
<Target Name="BuildPackage">
    <!-- Package for installing the MyApp Service -->
    <Zip Files="@(MyAppBinaries);@(MyAppOtherFiles)" Flatten="True" WorkingDirectory="$(MSBuildProjectDirectory)" ZipFileName="$(PackageOutputFolder)\$(PackageName)_$(Major).$(Minor).$(Revision)_Install.zip" />
    <!-- Package for MyApp Contracts -->
    <Zip Files="@(MyAppContracts)" Flatten="True" WorkingDirectory="$(MSBuildProjectDirectory)" ZipFileName="$(PackageOutputFolder)\$(PackageName)_MyAppContracts_$(Major).$(Minor).$(Revision)_Install.zip" />
</Target>

当TFS执行构建时,在TFS放置位置创建ZIP文件,或者为本地构建创建包装项目的bin文件夹。

第二个ZIP(包含2个DLL)总是在本地和TFS构建下创建好。

问题是当TFS进行构建时,第一个ZIP不包含EXE,只包含23个DLL中的2个(以及MyAppOtherFiles标识的所有3个文件)。 在本地完成构建(并且首先清空Packaging项目的bin文件夹)时,第一个ZIP不包含EXE或DLL ,只有MyAppOtherFiles标识的2个.bat文件。

如果我将BuildTargetFolder从$(TargetDir)更改为$(OutDir),我会得到相同的结果。

TFS构建定义使用未修改的默认模板。

就好像当TFS进行构建时,Packaging项目是要构建的第三个项目,而不是最后一个,因此只会压缩2个DLL。但是,检入TFS的解决方案与我在本地构建的解决方案完全相同,在这种情况下,脚本似乎无法看到任何二进制文件。如果再次完成本地构建(不清空Packaging项目的bin文件夹),则ZIP包含所有必需的文件,但这显然是因为在第一次构建之后bin文件夹现在包含EXE&amp;所有的DLL。

令人困惑的是,在TFS构建下,MyApp.HostService.exe.config(由构建产生)是压缩的,但不是MyApp.HostService.exe。为什么第二个ZIP总是创建好,当它包含在第一个ZIP中跳过的DLL ?????我已经尝试过交换ZIP创建的顺序,但没有区别!

我可以做些什么来确保在本地和TFS构建之后始终在构建所有项目之后完成压缩?

由于

2 个答案:

答案 0 :(得分:1)

确保您根据其他项目设置包装项目对解决方案的依赖性,这将始终首先构建其他项目,从而最后使用包装。

enter image description here

答案 1 :(得分:0)

我们做了类似的事情但我们有tfs构建定义设置来构建targets / proj文件而不是sln。在targets / proj文件中,我们有一个目标,它编译我们的应用程序,然后使用wix创建一个msi。在您的情况下,您应该创建一个目标,使用msbuild目标来编译您的exe项目,然后调用zip目标来压缩输出。您可以保留outdir参数,我们可以设置属性,以便输出转到您选择的目录。构建这个easy将在tfs服务器和本地工作。