13

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

4

2 回答 2

10

您所要求的非常明智,并且有多种方法可以实现这一目标。

就个人而言,当我这样做时,我不喜欢将文件签入到版本控制中,其中包含构建服务器生成的编号 - 它只是在跨分支合并代码时引入了太多的头痛,但我也喜欢已知的版本号当开发人员进行工作站构建与适当的构建服务器派生程序集时使用,以便真正轻松区分它们。

有关我喜欢如何做的更多信息,请查看 TFS Build Recipies wiki:

或我关于该主题的博客文章

希望有帮助,

马丁。

于 2009-02-13T13:13:23.400 回答
8

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

我们已经连接到 AfterGet 并导致我们的目标是依赖的:

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

我们的 VersionAssemblies Target 从 $(SolutionRoot) 中提取所有 AssemblyInfo.cs 文件:

<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"/>

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

<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 上 Microsoft SDC 任务附带的 File.Replace 任务。

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

于 2009-02-13T11:28:34.040 回答