1

我正在学习 TFS2010 Team Build、Workflow 和 MSBuild。我对 Workflow 有了大致的了解,并且最近能够成功地进行测试构建。

现在我需要一些帮助来保持构建版本和程序集版本同步。我一直在阅读Jim LambJohn Robbins关于这个主题的几篇博客,但是我现在比开始时感到更加困惑。Jim Lamb 的博客讨论了使用自定义活动,该活动使用当前日期来设置版本号,而 John Robbins 的博客讨论了获取最后一个程序集版本并在 MSBuild 中执行所有操作,因为没有额外的依赖项。

目前我们使用 4 位版本号,例如 3.8.0.2,然后我们为每个构建增加最后一个数字。我们使用这个版本来同步所有的程序集。我们希望保持这种格式,并且我想在工作流程中处理我的所有版本控制,但是我不知道如何以这种方式从程序集中读取最后一个版本。我认为这将需要编写自定义活动,但我将使用什么方法来阅读最新版本?

提前致谢!吉姆

4

1 回答 1

3

Stuart Preston 在他的博客上解释了一种设置程序集信息的简单方法:http: //stuartpreston.net/blog/2010/05/02/simple-assembly-versioning-with-team-build-2010/

编辑:

上面的链接已经失效,这里是缓存版本:

Stuart Preston 于 2010 年 5 月 2 日在 Team Foundation Server 下发布

有许多更复杂的方法可以实现这一点,但似乎没有一种方法能完全满足我的需求,因此在这里我介绍了另一种使用 Team Build 2010 进行程序集版本控制的方法。我希望我的 Team Build 编号与我的程序集版本完全匹配(而不是派生的),像这样:

(图片)

所以这就是我的做法。首先,我在构建定义中自定义 BuildNumber 格式:

(图片)

就我而言,我决定对其进行自定义,以便显式添加主要和次要版本号“0.1”。这让我可以控制我想要实现的版本号的前两部分。我还添加了前面$(Month)$(DayOfMonth)带有 a的宏。1对于 2010 年 5 月 2 日,这将生成一个数字 10502。(我在这里不使用全年的原因是今天它会生成一个内部版本号 100502 并且文件版本号不能高于 65335)。

当我决定在版本 0.2、0.3 或 1.0 上工作时,我所要做的就是在此处增加内部版本号并保存定义,我也很高兴在年份变化时增加编号。我说很简单!

内部版本号格式的最后一部分保持原样(即版本号在当天每次构建时递增 1,并在第二天重置)。

现在我们需要做的就是MSBuild在针对解决方案运行时检索此版本号,拆分版本号并将数字部分放入Properties\AssemblyVersion.cs文件中(您需要先注释掉AssemblyFileVersion该文件中的行并将其签入)。

这是您需要在.csproj文件中插入的片段(您必须检查它,然后在记事本或您喜欢的文本编辑器中打开它)。

<UsingTask
    TaskName="Microsoft.TeamFoundation.Build.Tasks.GetBuildProperties"
    AssemblyFile="$(MSBuildProgramFiles32)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\Microsoft.TeamFoundation.Build.ProcessComponents.dll"
  Condition="' $(BuildUri) '!='  '"/>

<Target Name="BeforeBuild" Condition="' $(BuildUri) '!='  '">
  <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
    <Output TaskParameter="BuildNumber" PropertyName="BuildNumber" />
  </GetBuildProperties>

  <PropertyGroup>
    <BuildNumberSplitLocation>$([MSBuild]::Add($(BuildNumber.LastIndexOf('_')),1))</BuildNumberSplitLocation>
  </PropertyGroup>

  <ItemGroup>
    <AssemblyVersionLines Include="[assembly:AssemblyFileVersion(&quot;$(BuildNumber.Substring($(BuildNumberSplitLocation)))&quot;)]" />
  </ItemGroup>

  <Exec Command="attrib -r &quot;$(ProjectDir)\Properties\AssemblyInfo.cs&quot;" ContinueOnError="false" />
  <Message Text="Lines being added: @(AssemblyVersionLines)" Importance="high" />
  <WriteLinesToFile File="$(ProjectDir)\Properties\AssemblyInfo.cs" Lines="@(AssemblyVersionLines)" />
</Target>

(参考结束)

他修改csproj文件以AssemblyInfo.cs在构建之前使用传入的值更新文件,TFS以便根据以下排列对程序集进行版本控制MMDDRev

您的情况有点不同,因为您想要一个自定义内部版本号。为此,您可以BuildNumberFormat3.8.0.$(Rev:.r). 由于修订是唯一改变的东西,TFS它将自动为您增加它。

如果您想更新该3.8.0.部分,您可以再次手动编辑内部版本号格式。BeforeBuild否则,您将需要一个解决方案来存储和解析内部版本号,作为csproj.

于 2012-05-16T17:08:59.423 回答