私は、そのようなタスクを .targets ファイルに入れ、メイン プロジェクト (ライブラリを作成していないプロジェクト) からそれらを参照することを好みます。Target
また、一般的なタスクのサブセットを結合する .targets ファイルに を作成することもあります。そうすれば、いくつかのプロジェクトは便利にsharedtask1
andsharedtask2
を実行できますが、他のプロジェクトはsharedtask1
andを実行します。sharedtask3
DependsOnTargets="Shared12"
DependsOnTargets="Shared13"
これらの記事には、msbuild タスクを整理するための良いアドバイスがあります。
信頼できるビルドを作成するためのベスト プラクティス、パート 1
信頼できるビルドを作成するためのベスト プラクティス、パート 2
編集
一部のタスクを 1 回だけ実行するには、上記の 2 番目の記事で説明されているように、インクリメンタル ビルドを使用します。
- 上記で示唆した共通の .targets ファイルで、すべてのファイルを入力として、いくつかのダミー マーカー ファイルを出力として持つタスクを作成します。
- そのタスクに関心のある実際の作業を実行させ、マーカー ファイルを更新します。
- すべてのプロジェクトが新しく作成されたタスクに依存するようにする
ソリューションがビルドされると、最初のプロジェクトが上記のタスクを開始し、タスクはマーカー ファイルを出力します。ビルドの残りの部分で入力ファイルが変更されない限り、そのタスクは再度実行されません。 . さて、これの欠点は
- ビルドの過程でファイルが生成または変更される場合、タスクは複数回実行されます。
- 単一のプロジェクトのビルドのみを実行している場合でも、タスクは実行されます。ドキュメントを生成している場合、これは実際には「正しい」動作である可能性があります。それを避けたい場合は、msbuild ファイルを本当に微調整する必要があると思いますが、それが回避しようとしているという印象を受けます。
- タスクはビルドされる前に実行されるため、アセンブリのビルドされるバージョンに依存するタスクはうまくいきません。
最後の問題に対処するには、VS からのビルドをあきらめ、代わりにコマンド ラインから msbuild.exe を使用して、ソリューションをビルドし、1 つまたは複数のカスタム タスクを順番に実行するカスタム タスクを呼び出す必要があります。おそらくあなたが求めている開発者体験ではないことを私は理解しています.