2009-02-13 27 views
13

我想知道是否有一种方法来同步内部版本号(20080213.1)而不使用BuildNumberOverrideTarget,我将不得不生成我自己的内部版本号?我基本上想使用默认的/内置的tfs buildnumber生成器,但想访问它以使我的程序集版本与它对齐。这可以做到吗,这是一种明智的做法吗?对齐程序集版本号与TFS Buildnumber

回答

8

是的,你可以。在某些情况下,可能在AfterGet中,您可以使用BuildNumber并创建一个自定义任务来更新源代码中的AssemblyInfo.cs文件。

我们已经勾搭成AfterGet,造成我们的目标是依赖:

<Target Name="AfterGet" DependsOnTargets="VersionAssemblies" /> 

我们VersionAssemblies目标翻出所有从$的AssemblyInfo.cs中的文件(SolutionRoot)的:

<CreateItem Include="$(SolutionRoot)\**\AssemblyInfo.cs;"> 
    <Output TaskParameter="Include" ItemName="AssemblyInfos"/> 
</CreateItem> 

检查他们出:

<Exec Command="$(TfCommand) checkout &quot;AssemblyInfo.cs&quot; -r" 
      WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="true"/> 

编辑它们并用$替换文件版本(Buil dNumber):

<File.Replace Path="%(AssemblyInfos.FullPath)" 
        NewValue="AssemblyFileVersion(&quot;$(BuildNumber)&quot;)" 
        RegularExpression="AssemblyFileVersion\(\&quot;(\d+.\d+.\d+.\d+)\&quot;\)" 
        IgnoreCase="true" 
        Force="true"/> 

,然后检查文件回:

<Exec Command="$(TfCommand) checkin /override:&quot;Automated&quot; /comment:&quot;Update AssemblyInfo files to version number $(BuildNumber) - $(NoCICheckinComment) &quot; /noprompt &quot;AssemblyInfo.cs&quot; /recursive" 
      WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="false"/> 

有关更换我用自带的CodePlex上,基于微软SDC tasks的File.Replace任务的文件版本。

另外请注意,如果您有一个在签入时触发的构建,在检查AssemblyInfo.cs文件时,请确保注释包含$(NoCICheckinComment),因为这会导致TFS不触发另一个构建,我将最终进入无限的构建循环。

+0

如何从$(BuildNumber)中获取构建版本和修订版本,默认为“MyBuildDefinition_20090213.1”格式? – Fadeproof 2009-02-13 11:32:12

+0

您可以编写一个自定义任务以去除MyBuildDefinition_部分并将其去掉。 – 2009-02-13 11:33:19

9

你所要求的是非常明智的,有很多方法可以实现这一点。

个人而言,当我这样做时,我不喜欢检查文件到版本控制中,这些文件中包含构建服务器生成的编号 - 它只是在跨分支合并代码时引入了太多的头疼,但我也喜欢当开发人员执行工作站构建时使用的已知版本号与适当的构建服务器派生程序集以使它们很容易分开。

欲了解更多关于如何我喜欢这样做,看看在TFS构建Recipies维基:

或在话题

希望有所帮助,

Martin。