MSBUILD 脚本应该在构建后将所有程序集压缩到解决方案中,但只获取一些 DLL(在本地和 TFS 构建下)
MSBUILD script should zip all assemblies in solution after build, but only gets some DLLs (under local and TFS build)
我想设置我的 VS 解决方案,以便在构建结束时将可安装文件压缩以便于分发。这应该在本地构建或 TFS 构建下工作。设置如下:
- 有一个项目(名为 MyApp.Packaging)不包含任何代码,只有一个 MSBUILD .targets 脚本
- 该项目引用了所有其他项目,因此最后构建(通过查看项目构建顺序确认)
- 构建脚本包含以下内容,用于识别和压缩(使用 MSBUILD Community Tasks 的 ZIP 任务)EXE 和 DLL 到两个不同的包中(还有其他代码从 version.txt 文件中提取版本号使用 MSBUILD 社区任务 - 为清楚起见省略)
<!-- 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>
ZIP 文件在 TFS 构建时在 TFS 放置位置创建,或者在本地构建的打包项目的 bin 文件夹中创建。
在本地和 TFS 构建下,第二个 ZIP(包含 2 个 DLL)总是创建成功。
问题是 当 TFS 进行构建时,第一个 ZIP 不包含 EXE,并且只包含 23 个 DLL 中的 2 个(以及 MyAppOtherFiles 识别的所有 3 个文件)。 在本地完成构建时(首先清空打包项目的 bin 文件夹),第一个 ZIP 不包含 EXE 或 DLL,只包含 MyAppOtherFiles 识别的 2 个 .bat 文件。
如果我将 BuildTargetFolder 从 $(TargetDir) 更改为 $(OutDir),我会得到相同的结果。
TFS 构建定义使用未修改的默认模板。
好像当TFS 构建时,Packaging 项目是要构建的第三个项目,而不是最后一个,因此只压缩了2 个DLL。但是,签入 TFS 的解决方案与我在本地构建的解决方案完全相同,在这种情况下,脚本似乎看不到任何二进制文件。如果本地构建再次完成(不清空打包项目的 bin 文件夹),ZIP 将包含所有必需的文件,但这显然是因为在第一次构建之后,bin 文件夹现在包含 EXE 和所有 DLL。
同样令人困惑的是,在 TFS 构建下,MyApp.HostService.exe.config(由构建生成)被压缩,而不是 MyApp.HostService.exe。为什么第二个 ZIP 总是创建正常,当它包含在第一个 ZIP 中跳过的 DLL 时?????我试过交换 ZIP 的创建顺序,但这没有区别!
在本地和 TFS 构建下,如何确保在构建所有项目后始终完成压缩?
谢谢
我们做了类似的事情,但我们有 tfs 构建定义设置来构建 targets/proj 文件而不是 sln。在 targets/proj 文件中,我们有一个编译应用程序的目标,然后使用 wix 创建一个 msi。在您的情况下,您应该创建一个目标,该目标使用 msbuild 目标来编译您的 exe 项目,然后调用 zip 目标来压缩输出。您可以保留 outdir 参数,因为我们可以设置 属性 以便输出到您选择的目录。构建这个简单的将在 tfs 服务器和本地工作。
确保您将打包项目依赖项设置为依赖于其他项目的解决方案,这样它总是会首先构建其他项目,从而让您最后打包。
我想设置我的 VS 解决方案,以便在构建结束时将可安装文件压缩以便于分发。这应该在本地构建或 TFS 构建下工作。设置如下:
- 有一个项目(名为 MyApp.Packaging)不包含任何代码,只有一个 MSBUILD .targets 脚本
- 该项目引用了所有其他项目,因此最后构建(通过查看项目构建顺序确认)
- 构建脚本包含以下内容,用于识别和压缩(使用 MSBUILD Community Tasks 的 ZIP 任务)EXE 和 DLL 到两个不同的包中(还有其他代码从 version.txt 文件中提取版本号使用 MSBUILD 社区任务 - 为清楚起见省略)
<!-- 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>
ZIP 文件在 TFS 构建时在 TFS 放置位置创建,或者在本地构建的打包项目的 bin 文件夹中创建。
在本地和 TFS 构建下,第二个 ZIP(包含 2 个 DLL)总是创建成功。
问题是 当 TFS 进行构建时,第一个 ZIP 不包含 EXE,并且只包含 23 个 DLL 中的 2 个(以及 MyAppOtherFiles 识别的所有 3 个文件)。 在本地完成构建时(首先清空打包项目的 bin 文件夹),第一个 ZIP 不包含 EXE 或 DLL,只包含 MyAppOtherFiles 识别的 2 个 .bat 文件。
如果我将 BuildTargetFolder 从 $(TargetDir) 更改为 $(OutDir),我会得到相同的结果。
TFS 构建定义使用未修改的默认模板。
好像当TFS 构建时,Packaging 项目是要构建的第三个项目,而不是最后一个,因此只压缩了2 个DLL。但是,签入 TFS 的解决方案与我在本地构建的解决方案完全相同,在这种情况下,脚本似乎看不到任何二进制文件。如果本地构建再次完成(不清空打包项目的 bin 文件夹),ZIP 将包含所有必需的文件,但这显然是因为在第一次构建之后,bin 文件夹现在包含 EXE 和所有 DLL。
同样令人困惑的是,在 TFS 构建下,MyApp.HostService.exe.config(由构建生成)被压缩,而不是 MyApp.HostService.exe。为什么第二个 ZIP 总是创建正常,当它包含在第一个 ZIP 中跳过的 DLL 时?????我试过交换 ZIP 的创建顺序,但这没有区别!
在本地和 TFS 构建下,如何确保在构建所有项目后始终完成压缩?
谢谢
我们做了类似的事情,但我们有 tfs 构建定义设置来构建 targets/proj 文件而不是 sln。在 targets/proj 文件中,我们有一个编译应用程序的目标,然后使用 wix 创建一个 msi。在您的情况下,您应该创建一个目标,该目标使用 msbuild 目标来编译您的 exe 项目,然后调用 zip 目标来压缩输出。您可以保留 outdir 参数,因为我们可以设置 属性 以便输出到您选择的目录。构建这个简单的将在 tfs 服务器和本地工作。
确保您将打包项目依赖项设置为依赖于其他项目的解决方案,这样它总是会首先构建其他项目,从而让您最后打包。