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

本文关键字:版本号 内部 程序集 同步 帮助 TFSBuild | 更新日期: 2023-09-27 18:34:34

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

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

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

提前感谢!吉姆

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

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

编辑:

上面的链接已死,这是缓存版本:

发布者 Stuart Preston on May 2, 2010 在 Team Foundation Server

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

(图片仅供参考(

这就是我的做法。 首先,我在构建定义中自定义内部版本号格式:

(图片仅供参考(

就我而言,我决定对其进行自定义,以便明确添加主要和次要版本号"0.1"。 这让我可以控制版本号的前两部分,这就是我想要实现的目标。 我还添加了宏$(Month)$(DayOfMonth),并在它前面有一个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文件,以在生成之前使用 TFS 传入的值更新AssemblyInfo.cs文件,以便根据 MMDDRev 的排列对程序集进行版本控制

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

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