MSBuild:如何使用来自同一源的不同版本生成多个生成?

MSBuild:如何使用来自同一源的不同版本生成多个生成?,msbuild,msbuildextensionpack,Msbuild,Msbuildextensionpack,我有一个MSBuild*.proj文件,它生成我的解决方案并使用变更集编号设置生成版本。 现在,我需要对同一解决方案进行两次构建,其中一个区别是: 第一个版本应该是“5.0.0.{chanset_number}”,而第二个版本是“2.0.0.{chanset_number}”。我使用以下代码获取最新变更集的编号并设置生成版本: <ItemGroup> <FilesToVersion Include="$(SolutionRoot)\GUI\Properties\Assemb

我有一个MSBuild*.proj文件,它生成我的解决方案并使用变更集编号设置生成版本。
现在,我需要对同一解决方案进行两次构建,其中一个区别是: 第一个版本应该是“5.0.0.{chanset_number}”,而第二个版本是“2.0.0.{chanset_number}”。

我使用以下代码获取最新变更集的编号并设置生成版本:

<ItemGroup>
  <FilesToVersion Include="$(SolutionRoot)\GUI\Properties\AssemblyInfo.cs" />
</ItemGroup>
<!-- Added for using the latest changeset id as build number -->
<Target Name="BuildNumberOverrideTarget">
  <BuildNumberGenerator>
    <Output TaskParameter="BuildNumber" PropertyName="BuildNumber" />
  </BuildNumberGenerator>
  <GetLatestChangeset>
    <Output TaskParameter="LatestChangeset" PropertyName="LatestChangeset" />
  </GetLatestChangeset>
</Target>
<Target Name="AfterGet" Condition="'$(IsDesktopBuild)'!='true' ">
  <MSBuild.ExtensionPack.VisualStudio.TfsVersion 
     TaskAction="SetVersion" Files="%(FilesToVersion.Identity)"
     Version="$(VersionMajor).$(VersionMinor).$(VersionService).$(LatestChangeset)" 
AssemblyVersion="$(VersionMajor).$(VersionMinor).$(VersionService).$(LatestChangeset)"
SetAssemblyVersion="true" />
</Target>

在此处添加PropertyGroup可能会有所帮助

<PropertyGroup>
    <MyVersionMajor Condition="$(MyVersionMajor)==''">$(VersionMajor)</MyVersionMajor>
</PropertyGroup>

$(VersionMajor)
如果未通过MSBuild参数显式设置,则将名为MyVersionMajor的属性设置为VersionMajor属性

要将MyVersionMajor设置为MSBuild参数,请在MSBuild命令中添加以下内容

MSBuild.exe <yourprojectfile> /p:MyVersionMajor=2
MSBuild.exe/p:MyVersionMajor=2
您现在需要更改生成目标以包含新属性:

<Target Name="AfterGet" Condition="'$(IsDesktopBuild)'!='true' ">
  <MSBuild.ExtensionPack.VisualStudio.TfsVersion 
     TaskAction="SetVersion" Files="%(FilesToVersion.Identity)"
     Version="$(MyVersionMajor).$(VersionMinor).$(VersionService).$(LatestChangeset)" 
AssemblyVersion="$(MyVersionMajor).$(VersionMinor).$(VersionService).$(LatestChangeset)"
SetAssemblyVersion="true" />
</Target>

确保新的属性组显示在此目标之前


当您在此项目上运行MSBuild而不指定参数时,您应该获得
“5.0.0.{changeset\u number}”
,当您指定参数时,您将获得
“2.0.0.{changeset\u number}”
,此解决方案似乎很有帮助,但我们有持续集成。你能告诉我在这种情况下每次签入后是否可以运行两个版本吗?@user1719690我对TFS一点也不熟悉,所以这可能根本不相关,但是您可以按照以下方式进行:
1)在每个MSBuild任务之后添加一个单独的生成文件,其中包含两个MSBuild任务实例(一个没有MyVersionMajor属性,另一个具有
2)使用复制任务[将输出作为工件复制到某个位置。