由于我没有使用TFS的经验,无法回答你所有的问题。
但是,我可以建议您使用一种比使用AssemblyInfo任务更新AssemblyInfo.cs文件更好的方法。该任务似乎只是从头开始重新创建标准的AssemblyInfo文件,并且会丢失您可能添加的任何自定义部分。
因此,我建议您研究MSBuild Community Tasks项目中的FileUpdate任务。它可以查找文件中的特定内容并替换它,就像这样:
<FileUpdate
Files="$(WebDir)\Properties\AssemblyInfo.cs"
Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="$(Major).$(ServicePack).$(Build).$(Revision)"
Condition="'$(Configuration)' == 'Release'"
/>
您可以通过几种方式控制构建编号的递增。因为我只希望在构建完全成功时才递增构建编号,所以我使用了两步方法:
- 从文本文件中读取一个数字(文件中唯一的内容是该数字),并将其加1而不改变文件;
- 在构建过程的最后一步,如果一切顺利,将递增的数字保存回文本文件。
有一些任务如ReadLinesFromFile可以帮助您完成这个操作,但我发现编写一个小的自定义任务最容易:
using System;
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace CredibleCustomBuildTasks
{
public class IncrementTask : Task
{
[Required]
public bool SaveChange { get; set; }
[Required]
public string IncrementFileName { get; set; }
[Output]
public int Increment { get; set; }
public override bool Execute()
{
if (File.Exists(IncrementFileName))
{
string lines = File.ReadAllText(IncrementFileName);
int result;
if(Int32.TryParse(lines, out result))
{
Increment = result + 1;
}
else
{
Log.LogError("Unable to parse integer in '{0}' (contents of {1})");
return false;
}
}
else
{
Increment = 1;
}
if (SaveChange)
{
File.Delete(IncrementFileName);
File.WriteAllText(IncrementFileName, Increment.ToString());
}
return true;
}
}
}
在执行FileUpdateTask之前,我使用此代码获取下一个构建编号:
<IncrementTask
IncrementFileName="$(BuildNumberFile)"
SaveChange="false">
<Output TaskParameter="Increment" PropertyName="Build" />
</IncrementTask>
在通知其他人之前,作为我构建的最后一步:
<IncrementTask
IncrementFileName="$(BuildNumberFile)"
SaveChange="true"
Condition="'$(Configuration)' == 'Release'" />
如何只在源代码更改时更新版本号,这个问题取决于您的构建过程与源控制的交互方式。通常,检查源文件更改应该启动持续集成构建。这是用来更新相关版本号的。