TFSBuild.proj と外部ターゲットのインポート
-
01-07-2019 - |
質問
オーバーライドされたビルド ターゲットを外部ファイルに保存し、そのターゲット ファイルを TFSBuild.proj に含めたいと考えています。発生するコア セット ステップがあり、ウィザードによって作成された TFSBuild.proj にインポート行を追加するだけで、これらの追加ステップを取得したいと考えています。
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets"/>
内のファイルをインポートすることはできません。 $(SolutionRoot)
これは、Import ステートメントが検証された時点ではソースがリポジトリからフェッチされていないためです。TFS が引き下げているようです TFSBuild.proj
最初は他のファイルなしで。
条件付きインポートを追加した場合でも、ソース管理にバージョンが存在する場合、そのバージョンはインポートされません。すでにディスク上に存在する以前のバージョンがインポートされます。
これらのビルド ターゲットをソースとともに保存することを諦めることもできますが、これはソース ツリーから移動する最初の依存関係であるため、これには気が進まないのです。
次のいずれかの方法はありますか?
- さらにいくつかのファイルをプルダウンするようにチーム ビルドに指示します。
Import
ステートメントは正しく評価されますか? - 次のようなチーム ビルド ターゲットをオーバーライドします。
AfterCompile
それ以外の方法でImport
? - 最終的には、ビルドしようとしているソースの下に保持されているビルド ターゲットをチーム ビルドで実行しますか?
解決
チーム ビルドには「ブートストラップ」フェーズがあり、チーム ビルド構成フォルダー (TFSBuild.proj のあるフォルダー) 内のすべてがバージョン管理からダウンロードされます。これは、ビルド エージェントが MSBuild.exe を呼び出して TFSBuild.proj を実行するように指示する前に、ビルド エージェントによって実行されます。
ターゲット ファイルを SolutionRoot の下から移動し、TFSBuild.proj ファイルと一緒に構成フォルダーに配置すると、相対インポート ステートメントを使用してそれを TFSBuild.proj ファイルにインポートできるようになります。
<Import Project="myTeamBuild.targets"/>
これらのターゲットが追加のカスタム MSBuild タスク アセンブリに依存している場合は、それらを TFSBuild.proj ファイルと同じフォルダーに置くこともでき、相対パスを使用して簡単に参照できます。
TFS2008 では、ビルド構成フォルダーはデフォルトで $/TeamProject/TeamBuildTypes の下にありますが、そこにある必要はないことに注意してください。実際には、ソリューション内のフォルダーに存在することもできます。また、チーム ビルド専用のソリューション内のプロジェクトにすることもできます。これには、ビルドの分岐が容易になるなど、いくつかの利点があります。したがって、通常、ビルドは次のようなフォルダーに配置します。
$/TeamProject/main/MySolution/TeamBuild
また、デフォルトでは、ビルドのブートストラップ フェーズ中に、ビルド エージェントはビルド構成フォルダー内のファイルのみをダウンロードし、サブフォルダーには再帰的にダウンロードしないことにも注意してください。ブートストラップ フェーズ中にサブフォルダー内のファイルを含めたい場合は、ビルド エージェント マシン (%ProgramFiles%\Visual Studio 9.0\Common7\IDE にあります) 上の tfsbuildserver.exe.config ファイルの appSettings で次のプロパティを設定できます。 \PrivateAssemblies)
<add key="ConfigurationFolderRecursionType" value="Full" />
複数のビルド エージェントがある場合は、すべてのマシンでこの設定を忘れずに設定する必要があり、そのビルド エージェントによって実行されるすべてのビルドに影響することに注意してください。そのため、実際には、ファイルをルートに保持することが最善です。可能であれば、構成フォルダーをビルドします。
幸運を、
マーティン。
他のヒント
ローカル開発マシンではなく、TFS がビルドを実行しているときにのみターゲットを実行する必要がある場合は、ターゲット ファイルをビルド自体のフォルダーに配置し、次のコマンドで参照できます。
<Import Project="$(MSBuildProjectDirectory)\my.team.build.targets.proj" />
ただし、すべてのビルドに対してターゲットを実行したい場合は、次のようなものを追加することで、個々のプロジェクトがターゲットを参照するように設定できます。
<Import Project="$(SolutionRoot)/libs/my.team.build/my.team.build.targets" Condition="Exists('$(SolutionRoot)/libs/my.team.build/my.team.build.targets')" />
私のプロジェクトでは実際にこれらの両方を使用しています。1 つ目では夜間のビルドをカスタマイズできるため、完全なソリューションのコンパイルを実行する前後に追加の手順を実行できます。2 つ目ではプロジェクトごとのカスタマイズが可能です。
インポートするオーバーライド ターゲット ファイルを作成し、TeamBuildOverrides.targets などの名前を付け、ビルド タイプの TFSBuild.proj が存在するソース管理内の同じフォルダーに配置すると、最初にプルされ、TFSBuild にインポートできるようになります。 .proj ファイル。デフォルトでは、TFSBuild.proj ファイルは、ソース管理のプロジェクトのルート フォルダーの直下にある TeamBuildTypes フォルダーに追加されます。
TFSBuild.proj ファイルで次の import ステートメントを使用します。
<Import Project="$(MSBuildProjectDirectory)\TeamBuildOverrides.targets" />
TFSBuild.proj ファイルに重複したオーバーライドがないことを確認してください。重複したオーバーライドがない場合、インポートされたオーバーライドは起動されません。