13

我有一个干净运行的 Team Foundation Server Build。它产生了几个程序集,我希望程序集版本的最后一个数字是变更集编号。也就是说,如果我使用 changeset11667 提交,例如程序集版本号应该是“xyz11667”。我检查了可用的宏,但没有一个是变更集编号。

我仍然希望能够像往常一样在我的开发机器上构建解决方案文件,只需使用签入的版本号。

我将如何解决这个问题?

4

5 回答 5

6

意识到一旦超过 65,535 个变更集,这将停止工作。也许您想更新其他字段。顺便说一句,是的,构建工程就是工程。指出解决方案并告诉它构建只是旅程的开始。

于 2012-04-18T13:17:46.680 回答
3

查看 CodePlex 上的Community TFS Build Extension 项目。它包含一个AssemblyInfo 活动TfsVersion 活动,它们能够在构建过程中使用自定义格式更改程序集信息。

要让它在您的开发机器上构建,您必须使用批处理文件和 TFS 命令行实用程序自行实现这些构建扩展。

于 2012-04-18T09:10:08.603 回答
3

我正在开发一种工具来自动化构建过程,它仍在开发中,它是开源的,这里是链接(我计划在大约一周内发布):

https://github.com/jupaol/NCastor

现在我建议您检查语义版本控制:

http://semver.org/

要从 TFS 获取最新的变更集,您有多种选择:

我建立了一个自定义例程来做到这一点

https://github.com/jupaol/NCastor/blob/develop/Solutions/NCastor.AutoBuilder/NCastor.AutoBuilder.Runner/Targets/Build/Versioning/VersionControlServers/TFS/GetTFSRevisionVersion.target

我必须构建该例程,因为社区任务和 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)" />

创建文件后,只需将该文件添加为每个项目的链接,瞧!您所有的项目都在共享通用的程序集信息。

于 2012-04-20T20:00:54.897 回答
2

最后,我的一位同事编写了以下解决问题的 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);
    }

}
于 2013-04-04T13:46:41.877 回答
0

你想这样做的目的是什么?如果您想在 DLL 和从 TFS 中提取的源代码之间建立关系,最好的方法是在 PDB 生成中使用 TFS 源代码控制来索引符号。这样,当您调试任何版本的软件时,Visual Studio 将在需要时从 TFS 获得正确版本的源代码。

于 2012-04-18T19:12:23.640 回答