让TFS将变更集放入程序集版本中

时间:2012-04-18 09:00:27

标签: tfs build version changeset

我的Team Foundation Server Build运行得很干净。它生成几个程序集,我希望程序集版本的最后一个数字是 changset 数字。也就是说,如果我提交changeset11667,例如程序集版本号应为“x.y.z.11667”。我检查了可用的宏,但没有一个是变更集号。

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

我将如何实现这一目标?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

查看Community TFS Build Extension project on CodePlex。它包含一个AssemblyInfo activityTfsVersion activity,它们能够在构建过程中使用自定义格式更改程序集信息。

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

答案 2 :(得分: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 Extenssions任务不能在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)" />

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

答案 3 :(得分: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);
    }

}

答案 4 :(得分:0)

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