0

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\binC\Release\binD\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さらに調査を行い、提供された提案を調べた結果、代わりにを使用する努力を断念することにしましたdevenvdevenvへの独自の呼び出しの準備中のボンネットの下でさらに多くのことが行われているようでありmsbuildmsbuild. msbuildfromへの呼び出しdevenvがログに記録されているかどうかを確認しようとしましたが、ログに記録されていないようです。ダミーの msbuild アプリを作成して、コマンドをダンプし、実際の msbuild を一時的に交換してこの診断情報を生成することを検討しましたが、現時点ではその価値よりも手間がかかります。パフォーマンスの向上はそれほど大きくないため、今のところさらに追求する価値があります。

4

2 に答える 2

0

OutputPathの代わりに設定することになっていOutputDirます。

すでに使用しているので/verbosity:diag、出力をテキストファイルにリダイレクトして、csc.exe(または使用中の別のコンパイラ)がバイナリを格納する場所を注意深く分析してみませんか?これは、MSBuildが内部でどのように機能するかを学ぶのに非常に簡単で有益です。

于 2013-02-05T02:32:28.680 に答える
0

プロジェクト プロパティの [ビルド] タブで [出力パス] を確認します。MSBuild を使用する場合と Visual Studio を使用する場合 (コマンド ラインからでも) には、いくつかの違いがあります。A を B、C、D とは異なるように構成し、A を残りの部分に同期すると機能する可能性があります。また、ソリューションとしてではなくプロジェクトを個別にビルドする場合は、プロジェクト ファイル自体で使用できないソリューション レベル マクロを使用しないようにしてください。

于 2013-02-04T22:17:58.377 に答える