我有一个干净运行的 Team Foundation Server Build。它产生了几个程序集,我希望程序集版本的最后一个数字是变更集编号。也就是说,如果我使用 changeset11667 提交,例如程序集版本号应该是“xyz11667”。我检查了可用的宏,但没有一个是变更集编号。
我仍然希望能够像往常一样在我的开发机器上构建解决方案文件,只需使用签入的版本号。
我将如何解决这个问题?
意识到一旦超过 65,535 个变更集,这将停止工作。也许您想更新其他字段。顺便说一句,是的,构建工程就是工程。指出解决方案并告诉它构建只是旅程的开始。
查看 CodePlex 上的Community TFS Build Extension 项目。它包含一个AssemblyInfo 活动和TfsVersion 活动,它们能够在构建过程中使用自定义格式更改程序集信息。
要让它在您的开发机器上构建,您必须使用批处理文件和 TFS 命令行实用程序自行实现这些构建扩展。
我正在开发一种工具来自动化构建过程,它仍在开发中,它是开源的,这里是链接(我计划在大约一周内发布):
https://github.com/jupaol/NCastor
现在我建议您检查语义版本控制:
要从 TFS 获取最新的变更集,您有多种选择:
我建立了一个自定义例程来做到这一点
我必须构建该例程,因为社区任务和 MSBuild 扩展任务无法在 64 位机器上运行,如果您使用 32 位机器进行构建,那么您可以使用以下任务:
使用http://msbuildextensionpack.codeplex.com/
<UsingTask AssemblyFile="$(ExtensionTasksPath)MSBuild.ExtensionPack.dll" TaskName="MSBuild.ExtensionPack.VisualStudio.TfsVersion"/>
使用http://msbuildtasks.tigris.org/
<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.Tfs.TfsVersion" />
设置不同版本的示例:
<UsingTask AssemblyFile="$(MSBuildCommunityTasksLib)" TaskName="MSBuild.Community.Tasks.AssemblyInfo" />
<MSBuild.Community.tasks.AssemblyInfo OutputFile="$(AssemblyVersionFilePath)"
CodeLanguage="C#"
AssemblyFileVersion="$(FileVersion)"
AssemblyInformationalVersion="$(InformationalVersion)"
AssemblyVersion="$(SemanticVersion)" />
创建文件后,只需将该文件添加为每个项目的链接,瞧!您所有的项目都在共享通用的程序集信息。
最后,我的一位同事编写了以下解决问题的 MSBuild 任务。
public class GetNextBuildNumber : Task
{
[Required]
public string TfsCommand { get; set; }
[Required]
public string TfsArgument { get; set; }
[Output]
public int BuildNumber { get; set; }
public override bool Execute()
{
BuildNumber = GetLatestVersionNumber();
return true;
}
private int GetLatestVersionNumber()
{
var process = new RunProcess();
var result = process.ExecuteCommand(TfsCommand, TfsArgument);
return ParseResult(result);
}
private int ParseResult(string result)
{
const string changeset = "Changeset:";
const string user = "User:";
if (string.IsNullOrEmpty(result) || !result.Contains(changeset))
{
// Invalid result
Log.LogWarning("Could not get latest build number. Reason: " + result);
return 0;
}
var indexOfChangeset = result.IndexOf(changeset, StringComparison.InvariantCulture) + changeset.Length;
var indexOfUser = result.IndexOf(user, StringComparison.InvariantCulture);
var revision = result.Substring(indexOfChangeset, indexOfUser - indexOfChangeset).Trim();
return Convert.ToInt32(revision);
}
}
你想这样做的目的是什么?如果您想在 DLL 和从 TFS 中提取的源代码之间建立关系,最好的方法是在 PDB 生成中使用 TFS 源代码控制来索引符号。这样,当您调试任何版本的软件时,Visual Studio 将在需要时从 TFS 获得正确版本的源代码。