3

John Robbins の記事TFS 2010 Build Number and Assembly File Versions: Completely In Sync with Only MSBuild 4.0を読みましたが、これを統合する最善の方法について疑問に思っています。

この記事のダウンロードには 2 つのファイルがあり、1 つはターゲット ファイルで、もう 1 つは proj ファイルです。

ターゲット ファイルには、Tfs ビルド番号 (ビルドに使用されるものと同じ) に基づいてビルド番号を取得し、その番号を他の proj ファイルで使用できるように特定の場所 (BuildNumberFile と呼びます) に書き込むための多くのタスクがあります。

proj ファイルは非常に単純です。前述のターゲット ファイルをインポートし、「All」という名前のターゲットを宣言するだけでなく、Project 要素の DefaultTargets も All であると宣言します。

    <Project ToolsVersion="4.0" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <!-- The two required properties so the Wintellect.TFSBuildNumber tasks knows your major and minor values.-->
            <TFSMajorBuildNumber>3</TFSMajorBuildNumber>
            <TFSMinorBuildNumber>1</TFSMinorBuildNumber>
        </PropertyGroup>

        <Import Project="Wintellect.TFSBuildNumber.targets"/>

        <!-- Just ask for the version information files you need. These are here to show all the diffent ones in 
           Wintellect.TFSBuildNumber.Targets. You can change the names -->
        <Target Name="All"
              DependsOnTargets="WriteSharedCSharpAssemblyVersionFile;
                              WriteSharedVBAssemblyVersionFile;
                              WriteSharedCPPCLIAssemblyVersionFile;
                              WriteSharedCPPAssemblyVersionFile;
                              WriteSharedWiXAssemblyVersionFile;
                              WriteSharedTextAssemblyVersionFile;"/>
    </Project>

これについて 2 つの質問があります。

  • 私はまだMSBuildを学んでいます。ターゲットの名前がターゲットの他の場所で指定されていない場合、ターゲットは実行されますか? このターゲットが確実に実行されるようにするにはどうすればよいですか?
  • csproj ファイルは、コンパイル時まで存在しない場合でも、BuildNumberFile がある場所のインクルード項目を宣言することになっていますか?
  • ItemGroups と Include には DependsOnTargets など、ビルド前にファイルが存在することを確認できるものがありますか?
  • これを使用した csproj ファイルの内容全体が BuildNumberFile の DependsOnTargets を表すターゲットにラップされることになっていますか?

ありがとう!

4

1 に答える 1

1

これは理解できたと思いますが、2 人の人が私の質問をプロモートしたので、ここで回答します。

  • 別のターゲットからターゲットへの依存関係を表現することで、ターゲットが確実に実行されるようにすることができます。Microsoft.Common.targets は、BeforeBuild と AfterBuild の 2 つのターゲットを明示的に公開して、カスタマイズ可能にするためにオーバーライドされます。これを行う最も簡単な方法は<Target Name="BeforeBuild" DependsOnTargets="WriteSharedCSharpAssemblyVersionFile" />、元の投稿のリンクからのダウンロードで WriteSharedCSharpAssemblyVersionFile が宣言されているターゲットであることがわかりました。また、MSBuild を初めて使用する場合は、Microsoft.CSharp.targets をインポートした後にこの BeforeBuild ターゲットを宣言する必要がありますが、既定の csproj テンプレートを使用すると、これを行うことができます。

  • WriteSharedCSharpAssemblyVersionFile ターゲットは、ソリューションを構築するときにすべてのターゲットが 1 回だけ実行されるため、ファイルを中央の場所に実際に書き込む必要があります。すべてのプロジェクトは、ファイルが存在しない場合でも、その場所からファイルを参照する必要があります。これは、コンパイルが行われるまでに (またはさらに重要なことに、参照が解決されるまでに)、BeforeBuild ターゲットが実行され、ファイルが配置されるためです。

    • 私の構造では、ブランチ ルート フォルダーの直下のフォルダーにこれらのバージョン管理ファイルがあります。さらに、ビルド中のファイルが生成されるので、出力ディレクトリにビルドしてもらいます。出力から参照するのは少し奇妙に思えますが、クリーンを実行する手段として出力ディレクトリを吹き飛ばすことができるように、すべてのビルド製品を 1 か所に配置するという不変条件が保持されます。
  • MSBuild では、項目はシステム (通常はファイル) への入力を構成するため、ターゲットに応じて項目を考えるのは奇妙です。いくらか学んだ後、この質問はあまり意味がありません。いずれにせよ、答えはノーです。

  • 実際、ファイルの内容全体を 1 つのターゲットにまとめてはいけません。必要なのは、csproj ファイルの先頭で Wintellect.TFSBuildNumber.targets ファイルをインポートし、最後に WriteSharedCSharpAssemblyVersionFile に対する BeforeBuild の依存関係を宣言することだけです。

お役に立てれば!

于 2010-10-03T04:51:28.890 に答える