多くのプロジェクトを含むソリューションの一部として、(<ProjectReference>
ソリューション内の他の 3 つのプロジェクトと他のいくつかのプロジェクトを介して) 参照するプロジェクトがあります。でAfterBuild
、3 つの特定の依存プロジェクトの出力を別の場所にコピーする必要があります。
さまざまなSOの回答などを介して、それを達成するために私が落ち着いた方法は次のとおりです。
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="true"
Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
<Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
</MSBuild>
<Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
しかし、これで問題が発生しました。<MSBuild
ステップのタスクは、最終的IncrementalClean
に のいくつかの出力を削除しますProjectC
。これを VS2008 で実行すると、build.force
ファイルが ProjectC のobj/Debug
フォルダーに置かれ、プロジェクトがこのターゲットを含む場合にソリューション全体でビルドを実行すると、ProjectC が再構築されますが、AfterBuild
このプロジェクトをビルドから除外すると、[正しく] は、ProjectC の再構築をトリガーしません (そして、ProjectCのすべての依存関係の再構築は重要です)。これは、この場合、TeamBuild またはその他のコマンドライン MSBuild 呼び出しのコンテキストでは発生しない VS 固有の策略である可能性があります (ただし、最も一般的な使用法は VS 経由であるため、いずれかの方法でこれを解決する必要があります)。
依存プロジェクト (および一般的なソリューションの残りの部分) はすべて VS と対話的に作成されているため、ProjectRefence
s には相対パスなどが含まれています。これが問題を引き起こす可能性があるという言及を見てきましたが、理由の完全な説明はありません。 、またはいつ修正されるか、またはそれを回避する方法。言い換えれば、ProjectReference
.csproj を手動で編集してパスを絶対パスに変換するなどにはあまり興味がありません。
私がばかげたことをしていて、誰かがすぐにそれが何であるかを指摘する可能性は十分にありますが (それは素晴らしいことです)、/v:diag
出力などを熟読するのに多くの時間を費やしたことを確認してください (ただし、から再現を構築しようとしたことはありません)ゼロから - これは比較的複雑な全体的なビルドのコンテキストにあります)