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

C# 需要有关使用TFSBuild保持内部版本号和程序集同步的帮助吗,c#,tfs,msbuild,tfsbuild,C#,Tfs,Msbuild,Tfsbuild,我正在学习TFS2010团队构建、工作流和MSBuild。我对工作流有了一个大致的了解,并且最近能够成功地进行测试构建 现在我需要一些帮助来保持构建版本和程序集版本控制的同步。我已经读了好几篇关于这个话题的博客,但是现在我比刚开始的时候更困惑了。Jim Lamb的博客讨论使用自定义活动,该活动使用当前日期设置版本号,John Robbins的博客讨论获取最后一个程序集版本并在MSBuild中执行所有操作,因为没有额外的依赖项 目前,我们使用的是4位版本号,如3.8.0.2,然后我们为每个构建增加

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

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

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

提前谢谢!
Jim

Stuart Preston在他的博客上解释了一种设置装配信息的简单方法:

编辑:

上面的链接已失效,以下是缓存版本:

2010年5月2日Stuart Preston在Team Foundation Server

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

(图片)

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

(图片)

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

当我决定使用版本0.2、0.3或1.0时,我所要做的就是在这里增加构建编号并保存定义,我也很乐意在年份发生变化时增加编号。我说这很简单

版本号格式的最后一部分保持原样(即,版本号在当天随每个版本增加1,并在第二天重置)

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

这是您需要插入到
.csproj
文件中的片段(您必须先将其签出,然后在记事本或您喜爱的文本编辑器中打开它)


$([MSBuild]::添加($(BuildNumber.LastIndexOf(“”),1))
(参考结束)

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

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


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

BeforeBuild
任务的一部分,您如何知道“最新版本”?具体存储在哪里?在xml格式的文本文件中。我认为不需要检查它,因为它可以手动创建或在构建开始时创建。这就是我目前在NAnt环境中进行构建的方式。感谢您的建议。我去看看。有没有办法获取主维护号、次维护号?我建议您为mow硬编码,但也有其他方法,将值存储在TFS中的文件中,并通过MSBuild社区任务进行访问。这种处理版本控制的方法在MSBuild中。我想在工作流活动中处理版本控制。
<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>