1

私は、Visual Studio 2012 で数百の C++ および C# プロジェクトを含む製品のビルド システムに取り組んでいます。SVN の更新後に VS/MSBuild が行う不要な再構築の量を最小限に抑えようとしています (多数の小さな問題を修正することによって)これにより、MSBuild は、プロジェクトが実際にはビルドを必要としない場合でも、ビルドが必要であると判断します)。

多くの作業を経て、これを達成しましたが、さらに一歩進めたいと考えています。保存されたビルド環境をあるビルド マシンから別のビルド マシンにコピーし、新しいマシンで最小限のビルドを実行できるようにしたいと考えています (これには、リリース後のパッチ ビルドに関連する正当な理由があります)。これにより多くの新しい問題が発生しましたが、そのほとんどは修正可能でした。しかし、マシンが同一である (元は同じイメージから複製された) という事実にもかかわらず、コピー後に再構築したいプロジェクトがまだいくつかあり、それらを理解することはできません。

これらの 1 つは、CLR を使用する C++ プロジェクトです。Sysinternals Debug Viewer によると、コピー後に再構築する理由は次のとおりです。

[4520]  up to date is missing: 'C:\WINDOWS\ASSEMBLY\NATIVEIMAGES_V4.0.30319_64\SYSTEM\92AE81C9B2BA0AD6ED7B7450EE024DC9\SYSTEM.NI.DLL.AUX' 
[4520]  up to date is missing: 'C:\WINDOWS\ASSEMBLY\NATIVEIMAGES_V4.0.30319_64\SYSTEM.XML\6EDF8B6D912547891F6EA5F12307C003\SYSTEM.XML.NI.DLL.AUX'

これは、プロジェクトがビルドへの入力として GAC 内のものを探していることを意味します。このプロジェクトには System.Xml がアセンブリ参照として含まれていますが、正しく参照されています (Framework ディレクトリから)。2 つのビルド マシンは同じイメージからのものであるため、すべてが同じ場所にあります。もちろん、GAC は異なりますが、ビルドは GAC をまったく見てはなりません。プロジェクトには、GAC でこのアセンブリを探す理由を示すものは何もありません。奇妙なことは、最初にビルドを行ったマシンでさえ、GAC に System.Xml 4.0 がないことです。このプロジェクトが新しいマシンで 1 回再構築された後は、問題ありません... GAC で何も変更されず、その後のインクリメンタル ビルドがプロジェクトに問題を起こすことはありません。

複製されたマシンにコピーされた後、最初のビルドでプロジェクトにこれが発生する理由を誰か考えられますか? 利用可能なすべてのビルド マシンをパッチのビルドに使用できるように、この問題の真相を突き止めたいと思います。

編集: さらに調査した結果、いくつかの手がかりが見つかりました。ビルド ディレクトリの xdcmake.read.1.tlog ファイルは、上記のファイルを参照します。何らかの理由で、Cygwin の grep ではこのファイル内のテキストが見つからないため、最初の検索では見つかりませんでした。とにかく、プロセス モニターを使用して、ビルドを実行する直前に Visual Studio がアクセスしたファイルを確認していましたが、これはその 1 つです。

xdcmake は、アセンブリ用のコード ドキュメント xml ファイルを作成するためのものです...存在しないファイルを参照しようとする理由がわかりません。さらに、MSBuild が現在のインクリメンタル ビルドへの入力について以前のドキュメント ログを参照している理由がわかりません。ここにはいくつかのバグがあるようです。

4

1 に答える 1

1

いつか他の誰かがこの問題を抱えた場合に備えて、ここに解決策を載せると思いました。

ビルド ディレクトリの xdcmake.read.1.tlog ファイルは、上記のファイルを参照します。xdcmake は、アセンブリのコード ドキュメント xml ファイルを作成するためのものです。一部の .Net フレームワーク アセンブリ (上記の場合は System.XML) に構成ミスがあり、xdcmake が適切な場所ではなく GAC でそれらを参照する原因となります。

解決策は、インクリメンタル ビルドの前に、すべての xdcmake.read ファイルで GAC アセンブリへの参照を削除することです。

于 2013-09-18T23:02:26.390 に答える