13

独自のビルド番号を生成する必要がある BuildNumberOverrideTarget を使用せずにビルド番号 (20080213.1) を同期する方法があるかどうか疑問に思っていますか? 基本的に、デフォルト/組み込みの tfs ビルド番号ジェネレーターを使用したいのですが、それにアクセスして、アセンブリのバージョンをそれに合わせたいと考えています。これを行うことはできますか?このようにするのは賢明な方法ですか?

4

2 に答える 2

10

あなたが求めていることは非常に賢明であり、これを達成する方法はたくさんあります。

個人的には、これを行うとき、ビルド サーバーが生成した番号を持つファイルをバージョン管理にチェックインするのは好きではありません。ブランチ間でコードをマージするときにあまりにも多くの頭痛の種が発生するだけでなく、既知のバージョン番号も好きです。開発者がワークステーション ビルドと適切なビルド サーバーから派生したアセンブリを実行するときに使用して、それらを簡単に区別できるようにします。

私のやり方の詳細については、TFS Build Recipies wiki を参照してください。

またはトピックに関する私のブログ投稿

それが役立つことを願って、

マーティン。

于 2009-02-13T13:13:23.400 に答える
8

はい、できます。ある時点で、おそらく AfterGet で、BuildNumber を使用してカスタム タスクを作成し、ソース コード内の AssemblyInfo.cs ファイルを更新できます。

AfterGet にフックして、ターゲットを依存させました。

<Target Name="AfterGet" DependsOnTargets="VersionAssemblies" />

VersionAssemblies ターゲットは、$(SolutionRoot) からすべての AssemblyInfo.cs ファイルをプルします。

<CreateItem Include="$(SolutionRoot)\**\AssemblyInfo.cs;">
    <Output TaskParameter="Include" ItemName="AssemblyInfos"/>
 </CreateItem>

それらをチェックアウトします:

<Exec Command="$(TfCommand) checkout &quot;AssemblyInfo.cs&quot; -r"
          WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="true"/>

それらを編集し、ファイル バージョンを $(BuildNumber) に置き換えます。

<File.Replace Path="%(AssemblyInfos.FullPath)"
                  NewValue="AssemblyFileVersion(&quot;$(BuildNumber)&quot;)"
                  RegularExpression="AssemblyFileVersion\(\&quot;(\d+.\d+.\d+.\d+)\&quot;\)"
                  IgnoreCase="true"
                  Force="true"/>

次に、ファイルをチェックインします。

<Exec Command="$(TfCommand) checkin /override:&quot;Automated&quot; /comment:&quot;Update AssemblyInfo files to version number $(BuildNumber) - $(NoCICheckinComment) &quot; /noprompt &quot;AssemblyInfo.cs&quot; /recursive"
          WorkingDirectory="$(MSBuildProjectDirectory)\..\sources" ContinueOnError="false"/>

ファイル バージョンの置換には、CodePlex の Microsoft SDC タスクに付属する File.Replace タスクを使用します。

また、チェックインでトリガーされるビルドがある場合は、AssemblyInfo.cs ファイルをチェックインするときに、コメントに $(NoCICheckinComment) が含まれていることを確認してください。これにより、TFS が別のビルドをトリガーしなくなります。ビルドの無限ループ。

于 2009-02-13T11:28:34.040 に答える