6

会社で新しい Team Foundation/Build サーバーをセットアップする任務を負っています。これを使用して、新しいプロジェクトを開始します。ここには現在、TFS の経験がある人は誰もいないので、すべて独学で学んでいます。これまでのところすべてが機能しています。サーバーがセットアップされ、リポジトリとチーム プロジェクトが作成され、ビルド サーバーが作成されました。ソース管理と継続的インテグレーション ビルド (ビルド サーバー上) が適切に実行されることを確認するための単純な Hello World アプリケーションを作成しました。

ただし、自動バージョン管理の設定に問題があります。TfsVersioning プロジェクトをインストールしましたが、正常に動作しています。アセンブリ バージョンの形式を定義できます。どの形式を使用するかはまだ決めていません。おそらく Major.Minor.Changeset.Revision のようなものです (アセンブリ バージョンでの変更セット番号の使用に関する潜在的な問題を認識しているため、開発を開始する前に Major.Minor.Julian.Revision に切り替えることにするかもしれません)。

問題: アセンブリのソース コードが最後のビルド以降に変更されていない場合、アセンブリに新しいファイル バージョンを持たせたくありません。継続的インテグレーション ビルドでは、ビルド サーバーは変更されたソース ファイルのみを取得し、更新されたモジュールのみを生成するインクリメンタル ビルドを引き起こすため、これは問題ではありません。既存の変更されていないモジュールはビルドされないため、それらのバージョンは変更されません。ナイトリー ビルドをセットアップする場合は、ワークスペースをクリーンアップして Build-All を実行します。ただし、これは、すべてのアセンブリが新しいバージョンを持つことを意味します (アセンブリ ファイルのバージョンにビルド番号が含まれていると仮定します)。

解決策? これにより、アセンブリ ファイル バージョンで最新の変更セット番号を使用することを検討するようになりました。このように、2 つの連続する Build-All の間に何もコミットされていない場合、バージョンはインクリメントされません。ただし、これは、1 つのファイルを変更してコミットすると、すべてのアセンブリでバージョンが強制的にインクリメントされることを意味します。

次の 2 つのいずれかを探しています。

  • ソース/依存関係が最後のビルド以降に変更された場合にのみ、アセンブリのバージョン番号をインクリメントする方法。Build-All が連続して実行されても、バージョン番号が変更されることはありません。

また

  • テスターと非開発者が、ファイル バージョンが異なっていても、アセンブリ 'Foo' のバージョン WXYZ とバージョン WXYZ+1 が同一であることを確認できる方法。

私はおそらくこのテーマに関する記事を 20 ほど読んだことがありますが、誰も (この人を除いて) この問題に取り組んでいないようです。私が求めていることが Team Foundation ALM の一般的な慣行ではない場合、上記の 2 番目の箇条書きにどのように対処すればよいですか?

御時間ありがとうございます!

4

1 に答える 1

2

これは私が過去にやったことです。このソリューションには、次の 2 つの重要なポイントがあります。

  1. インクリメンタル ビルドを使用する必要があります。つまり、Clean Workspace = None です。
  2. AssemblyInfo.cs への変更は、各プロジェクトで計算する必要があります

この後者は最も複雑であり、ここではソリューションのドラフトを作成します。

カスタム MSBuild プロパティで CustomAfterMicrosoftCommonTargets を使用して、通常の Visual Studio コンパイルでフックを挿入します。

/property:CustomAfterMicrosoftCommonTargets=custom.proj

バージョンの値も転送します

/property:BuildNumber=1.2.3.4

custom.proj でターゲットの BeforeCompile を同様のものに再定義します

<Target Name="BeforeCompile"
Inputs="$(MSBuildAllProjects);
        @(Compile);                               
        @(_CoreCompileResourceInputs);
        $(ApplicationIcon);
        $(AssemblyOriginatorKeyFile);
        @(ReferencePath);
        @(CompiledLicenseFile);
        @(EmbeddedDocumentation); 
        $(Win32Resource);
        $(Win32Manifest);
        @(CustomAdditionalCompileInputs)"
Outputs="@(DocFileItem);
         @(IntermediateAssembly);
         @(_DebugSymbolsIntermediatePath);                 
         $(NonExistentFile);
         @(CustomAdditionalCompileOutputs)" 
Condition="'$(BuildNumber)'!=''">

<Message Text="*TRACE* BuildNumber: $(BuildNumber)"/>

<MyTasksThatReplaceAssemblyVersion
    BuildNumber="$(BuildNumber)"
    File="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"/>
</Target>

AssemblyInfo.cs ソースの AssemblyFileVersion を置き換えるタスクが必要です。MSBuild 拡張パックには、この目的のための AssemblyInfo タスクがあります。

詳細については、こちらこちら、およびこちらのブログをご覧ください。

于 2014-03-17T21:00:19.180 に答える