需要有关使用TFSBuild保持内部版本号和程序集同步的帮助

时间:2012-05-16 16:19:27

标签: c# tfs msbuild tfs2010 tfsbuild

我正在学习TFS2010团队构建,工作流和MSBuild。我对Workflow有了一般的了解,最近能够成功地进行测试。

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

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

提前致谢! 吉姆

1 个答案:

答案 0 :(得分: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)的宏1。对于2010年5月2日,这将生成一个数字10502.(我之所以不使用全年的原因是,今天它将生成100502的内部版本号,文件版本号不能高于65335)。

当我决定使用版本0.2,0.3或1.0时,我所要做的就是在这里增加Build Number并保存定义,我也很高兴在年份变化时增加数字。我说这很简单!

构建号格式的最后一部分保持原样(即修订号在当天每次构建时增加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 <的排列对程序集进行版本控制/ p>

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

如果您想要更新3.8.0.部分,可以再次手动编辑内部版本号格式。否则你需要一个存储和解决方案。将构建号解析为BeforeBuildcsproj任务的一部分。