我想知道是否有办法在不使用BuildNumberOverrideTarget的情况下同步内部版本号(20080213.1),我必须生成自己的内部版本号?我基本上想要使用默认/内置tfs buildnumber生成器,但想要访问它以使我的程序集版本与它对齐。可以这样做,这是一种明智的方式吗?
答案 0 :(得分:10)
你所要求的是非常明智的,有很多方法可以达到这个目的。
就个人而言,当我这样做时,我不喜欢检查版本控制中的文件,其中包含构建服务器生成的编号 - 它只是在跨分支合并代码时引入了太多的头痛,但我也喜欢当开发人员进行工作站构建而不是正确的构建服务器派生程序集时使用的已知版本号,以便很容易区分它们。
有关我喜欢这样做的更多信息,请查看TFS Build Recipies wiki:
或关于主题的博客文章
希望有所帮助,
马丁。
答案 1 :(得分: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 "AssemblyInfo.cs" -r"
WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="true"/>
编辑它们并用$(BuildNumber)替换文件版本:
<File.Replace Path="%(AssemblyInfos.FullPath)"
NewValue="AssemblyFileVersion("$(BuildNumber)")"
RegularExpression="AssemblyFileVersion\(\"(\d+.\d+.\d+.\d+)\"\)"
IgnoreCase="true"
Force="true"/>
然后检查文件:
<Exec Command="$(TfCommand) checkin /override:"Automated" /comment:"Update AssemblyInfo files to version number $(BuildNumber) - $(NoCICheckinComment) " /noprompt "AssemblyInfo.cs" /recursive"
WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="false"/>
为了替换文件版本,我使用CodePlex上的Microsoft SDC tasks附带的File.Replace任务。
另请注意,如果您有一个在签入时触发的构建,则在签入AssemblyInfo.cs文件时,请确保该注释包含$(NoCICheckinComment),因为这会导致TFS不会触发另一个构建,否则您将最终进入无限构建循环。