13

Team Foundation Server ビルドが正常に実行されています。いくつかのアセンブリが生成されます。アセンブリのバージョンの最後の番号が変更セット番号になるようにしたいと思います。つまり、たとえば changeset11667 でコミットすると、アセンブリのバージョン番号は「xyz11667」になるはずです。利用可能なマクロを確認しましたが、変更セット番号はありません。

チェックインされたバージョン番号を使用するだけで、通常どおり開発マシンでソリューション ファイルをビルドできるようにしたいと考えています。

これを実現するにはどうすればよいですか?

4

5 に答える 5

6

変更セットが 65,535 を超えると、これは機能しなくなることに注意してください。おそらく、他のフィールドを更新したいと思うでしょう。ところで、はい、ビルド エンジニアリングはエンジニアリングです。ソリューションを指差して構築するよう指示することは、旅の始まりにすぎません。

于 2012-04-18T13:17:46.680 に答える
3

私はビルド プロセスを自動化するツールに取り組んでいます。これはまだ開発中であり、オープン ソースです。リンクは次のとおりです (約 1 週間でリリースを計画しています)。

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 に答える
3

CodePlexのCommunity TFS Build Extension プロジェクトをご覧ください。カスタム形式を使用してビルド プロセス中にアセンブリ情報を変更できるAssemblyInfo アクティビティTfsVersion アクティビティが含まれています。

開発マシンでビルドするには、バッチ ファイルと TFS コマンド ライン ユーティリティを使用して、これらのビルド拡張機能を独自に実装する必要があります。

于 2012-04-18T09:10:08.603 に答える
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 に答える