【问题标题】:MSBuild TFS Build NumberMSBuild TFS 内部版本号
【发布时间】:2010-12-04 20:13:11
【问题描述】:

我已经使用 SVN 有一段时间了。最近在我使用 TFS 的一个项目中。对于构建,我喜欢在项目输出上附加/更新构建版本号。我在母版页上执行此操作,以便它在应用程序上清晰可见。由于应用程序可以在多台机器上运行,因此可以方便地了解正在运行的版本。

我在 SVN 世界中实现了这一点:

  <!-- Import of the MSBuildCommunityTask targets -->
    <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
    <!-- to AssemblyInfo to include svn revision number -->
    <Target Name="BeforeBuild">
      <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(ProgramFiles)\CollabNet Subversion Client">
        <Output TaskParameter="Revision" PropertyName="Revision" />
      </SvnVersion>
      <Time>
        <Output TaskParameter="Year" PropertyName="Year" />
        <Output TaskParameter="Month" PropertyName="Month" />
        <Output TaskParameter="Day" PropertyName="Day" />
      </Time>
      <FileUpdate Files="MasterPage.master" Regex="svn revision: (\d+)\.(\d+)\.(\d+)\.(\d+)" ReplacementText="svn revision: $(Year).$(Month).$(Day).$(Revision)" />
    </Target>

正如您在上面看到的,“BeforeBuild”任务使用 YYYY.MM.DD.SVNVERSION 标记更新了 masterPage.master 文件。

如何使用 TFS 作为源代码控制来实现这一点。如何获取 TFS 内部版本号?

【问题讨论】:

  • 你的示例源代码被吃掉了。

标签: tfs msbuild msbuild-task tfsbuild


【解决方案1】:

假设您指的是 Team Build,则 $(BuildNumber) 属性包含当前的内部版本号。

有关可用属性的完整参考,请参阅 http://blogs.msdn.com/aaronhallberg/archive/2008/02/12/team-build-2008-property-reference.aspx

如果您只是在运行 MSBuild,我不相信它会生成/应用整体内部版本号(每个项目在其 AssemblyInfo.cs [默认情况下] 文件中都有一个单独的、可能自动递增的版本号) .您可以在运行时使用 System.Reflection.Assembly 类为特定程序集动态获取此版本号。


更新

从 TFS 2010 开始,“BuildNumber”变量不再由 TFS 自动传递给 MSBuild 进程。 TFS 2010 现在使用 Windows Workflow 作为其内部构建引擎,因此如果您想要构建号,您必须修改构建定义以包含它,如 this MSDN article 中所述。

【讨论】:

  • 谢谢,解决了。
  • 啊,是的,这对于非团队构建构建来说是一个很好的解决方案,我必须记住这一点。
  • 至少从 TFS 2013 开始,您不必修改构建定义。您可以读取环境变量 $(TF_BUILD_BUILDNUMBER)。有关所有环境变量的列表,请参阅此答案:*.com/questions/22293671/…