Visual Studio の devenv.exe へのコマンド ライン呼び出しを使用してプロジェクトをビルドするビルド プロセス (「エンジン」と呼びましょう) があります。VS が MSBuild を使用してビルドしているだけであることは以前から知っていたので、最終的にエンジンを更新して MSBuild を直接使用することにしました。しかし、MSBuild で奇妙な異常が見つかりました。
議論のために、プロジェクト A、B、C、および D があります。プロジェクト A は、私が構築しているメイン プロジェクトであり、(プロジェクト参照を通じて) 他の 3 つのプロジェクトに依存する Web アプリです。VS で手動でビルドA\bin
すると、アセンブリが取り込まれます。エンジンに組み込まれるdevenv.exe
A\bin
と、予想されるバイナリが再び取り込まれます。エンジンでビルドする場合は MSBuild を使用し、A\bin
何も含みません。ただし、B\Release\bin
とC\Release\bin
にD\Release\bin
は、前の 2 つのビルド方法を使用した場合と同様に、バイナリが含まれています。
これは、単一のプロジェクトでも発生します。この問題は、依存プロジェクトに関連していないようです。
MSBuild プロパティを明示的に設定しようとしましOutDir
たが、何の影響もないようです。
診断出力をオンにしてビルドを実行しましたが、明白なものは何も表示されません (確かに、そこにはたくさんあるので、重要なものをまだ見つけていない可能性があります)。
また、実行時にVSが作成しているMSBuildへのコマンドライン呼び出しを確認する方法を理解しようとしていますがdevenv.exe
、見つけられないようです。
他のいくつかの SO 投稿 (こことここ) を見てきましたが、同じ問題ではありません。
これが何であるか、または答えやより多くの診断情報を探すことができる他の場所を知っている人はいますか?
編集 1: MSBuild の呼び出しに使用される引数パターンは次のようになります。
/nologo /target:Compile /property:Configuration=%%BUILDCONFIG%% /maxcpucount
/property:OutDir=%%OUTDIR%%\bin\ /verbosity:diag /detailedsummary "%%PROJPATH%%"
その下半分は、出力ディレクトリと拡張出力にプロセスの詳細を表示するよう強制しようとしたことを示しています。ビルド エンジン コードは、ビルドされるプロジェクトの適切な置換値を持つ "%%TOKEN%%" 項目に置き換えられます。
EDIT 2:msbuild
さらに調査を行い、提供された提案を調べた結果、代わりにを使用する努力を断念することにしましたdevenv
。devenv
への独自の呼び出しの準備中のボンネットの下でさらに多くのことが行われているようでありmsbuild
、msbuild
. msbuild
fromへの呼び出しdevenv
がログに記録されているかどうかを確認しようとしましたが、ログに記録されていないようです。ダミーの msbuild アプリを作成して、コマンドをダンプし、実際の msbuild を一時的に交換してこの診断情報を生成することを検討しましたが、現時点ではその価値よりも手間がかかります。パフォーマンスの向上はそれほど大きくないため、今のところさらに追求する価値があります。