我无法回答您的所有问题,因为我没有使用 TFS 的经验。
但我可以推荐一种比使用 AssemblyInfo 任务更好的方法来更新您的 AssemblyInfo.cs 文件。该任务似乎只是从头开始重新创建标准 AssemblyInfo 文件,并且丢失了您可能添加的任何自定义部分。
因此,我建议您查看 MSBuild 社区任务项目中的 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'" />
关于如何仅在源代码发生更改时更新版本号的其他问题在很大程度上取决于您的构建过程如何与源代码管理进行交互。通常,签入源文件更改应该启动持续集成构建。那是用来更新相关版本号的。