Tfs2010ビルド番号とアセンブリファイルのバージョンとMSBuildターゲット
-
27-09-2019 - |
質問
JohnRobbinsの記事を読みました
記事のダウンロードには2つのファイルがあります。1つはターゲットファイルで、もう1つはプロジェクトファイルです。
ターゲットファイルには、Tfsビルド番号(ビルドに使用されたものと同じ)に基づいてビルド番号を取得し、他のプロジェクトで使用できるようにその番号を特定の場所(BuildNumberFileと呼びます)に書き出すタスクがいくつかあります。ファイル。
projファイルは非常に単純です。前述のターゲットファイルをインポートし、「All」という名前のターゲットを宣言すると同時に、Project要素のDefaultTargetsもAllとして宣言します。 ジェネラコディセタグプレ
これについて2つの質問があります:
- 私はまだMSBuildを学んでいます。ターゲットの名前がターゲットの他の場所で指定されていない場合、ターゲットは実行されますか?このターゲットが実行されていることを確認するにはどうすればよいですか?
- csprojファイルは、コンパイル時まで存在していなくても、BuildNumberFileがある場所のインクルードアイテムを宣言することになっていますか?
- ItemGroupsとIncludeには、ビルドする前にファイルが存在することを確認できるDependsOnTargetsなどがありますか?
- これを使用するcsprojファイルの内容全体は、BuildNumberFileのDependsOnTargetsを表すターゲットにラップされているはずですか?
ありがとう!
解決
これは理解できたと思いますが、2人が私の質問を宣伝したので、ここで回答します:
-
別のターゲットからの依存関係を表現することで、ターゲットが確実に実行されるようにすることができます。 Microsoft.Common.targetsは、カスタマイズ可能性のためにオーバーライドすることを明確に目的として、BeforeBuildとAfterBuildの2つのターゲットを公開します。これを行う最も簡単な方法は、WriteSharedCSharpAssemblyVersionFileが元の投稿のリンクからのダウンロードで宣言されたターゲットである
<Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" />
であることがわかりました。また、MSBuildを初めて使用する場合は、Microsoft.CSharp.targetsをインポートした後で、このBeforeBuildターゲットを宣言する必要がありますが、デフォルトのcsprojテンプレートを使用するとこれを行うことができます。 -
WriteSharedCSharpAssemblyVersionFileターゲットは、ソリューションを構築するときにすべてのターゲットが1回だけ実行されるため、実際にファイルを中央の場所に書き込む必要があります。コンパイルが行われるまでに(またはさらに重要なことに、参照が解決されるまでに)、BeforeBuildターゲットが実行され、ファイルが配置されるため、すべてのプロジェクトは、ファイルが存在しない場合でも、その場所からファイルを参照する必要があります。
- 私の構造では、これらのバージョン管理ファイルは、ブランチルートフォルダーのすぐ下のフォルダーにあります。さらに、ビルド中のファイルが生成されるので、出力ディレクトリにビルドしてもらいます。出力から物事を参照するのは少し奇妙に思えますが、クリーンを実行する手段として出力ディレクトリを吹き飛ばすことができるように、すべてのビルド製品を1か所に配置するという不変条件を保持します。
-
MSBuildでは、アイテムはシステム(通常はファイル)への入力を構成するため、ターゲットに応じてアイテムを考えるのは奇妙です。いくつかの学習の後、この質問はあまり意味がありません。いずれにせよ、答えはノーです。
-
ファイルの内容全体が1つのターゲットに含まれている必要はありません。必要なのは、csprojファイルの先頭にあるWintellect.TFSBuildNumber.targetsファイルをインポートし、BeforeBuildのWriteSharedCSharpAssemblyVersionFileへの依存を宣言することだけです。最後に。
これがお役に立てば幸いです!