78

タイトルが示すように、私は現在、約 50 個のプロジェクトを含む VS2010 ソリューションを持っています。何も参照しない「最上位」プロジェクトに変更を加えても、VS は 50 個のプロジェクトすべてを再構築します。アドオンなしで Visual Studio 2010 Ultimate を実行しています。ILMerge を使用して、すべてのプロジェクトを 1 つのファイルに統合しています。

下位レベルの dll のタイムスタンプをチェックしてこれを確認したところ、コードが変更されていなくても、実際に再構築されていることがわかりました。

私はすべての応答とコメントを読みました:

Visual Studio 2008 が再構築を続ける

Visual Studio はすべてを構築し続けます

私のソリューションで奇妙な VS2010 ビルドの不具合が発生する

Visual Studio で C# プロジェクトをリビルドする理由

しかし、それらのほとんどは、ビルド時間を短縮するためにプロジェクトをアンロードすることに関する提案を提供するだけで、修正に関して具体的なものは何もありません. 私は、VSがこれらの依存プロジェクトを再構築する必要がないのに再構築する必要があると考える理由を理解しようとしています。

[ツール] > [オプション] > [プロジェクトとソリューション] > [ビルドと実行] > [実行時にスタートアップ プロジェクトと依存関係のみをビルド] をオンにしましたが、効果はありません。

また、直接の依存関係が 8 つしかない「中間レベル」のプロジェクトを再構築すると、ILMerge が呼び出されず、依存プロジェクトが変更されていなくても、8 つのプロジェクトすべてが構築されます。

皆さん、ご意見をお寄せいただきありがとうございます。

追加した

いくつかの提案をテストするために、新しい WinForms プロジェクトをゼロから作成しました。次に、そのソリューション内に 2 つの新しいプロジェクトを作成しました。2 つの「最下位レベル」プロジェクトからすべてのコードとリソース (プロジェクト ファイルではない) を 2 つの新しいプロジェクトにコピーしました (ファイルとフォルダーをエクスプローラーから Visual Studio のプロジェクトにドロップすることでこれを行いました)。

最下位のプロジェクト、それをBと呼びましょう、他のプロジェクトを参照していませんでした。次のプロジェクトAはBのみを参照しました。したがって、必要な .NET および外部アセンブリ参照をプロジェクトに追加すると、ソリューションがビルドされます。

次に、新しい WinForm プロジェクトにAを参照させ、フル ビルドを行いました。したがって、参照チェーンは次のとおりです。

WinForm -> A -> B

次に、WinForm のみを変更し、標準ビルド (F6) を行いました。以前と同様に、Visual Studio は 3 つのプロジェクトすべてを再構築しました。

プロジェクトBのソース ファイルを体系的に削除した後、and を削除するResources.Designer.csと(そして、それらのリソースResources.resxのオブジェクトを使用するコードをコメント アウトすると)、 WinFormを変更してもソリューション全体が再構築されなくなり、再構築のみが行われることがわかりました。ウィンフォーム.Properties.Resources

を追加してプロジェクトBResources.resxに戻すと(ただし、リソースを使用しないように参照コードをコメントアウトしたままにする)、完全なビルド動作が再び導入されます。Resources.Designer.cs

リソース ファイルが破損していないかどうかを確認するために、それらをもう一度削除してから ([プロジェクトのプロパティ] -> [リソース] を使用して) 新しいリソースを作成し、以前と同じリソース (単一の Excel ファイル) を再度追加しました。このセットアップでは、完全な再構築が引き続き行われます。

次に、単一のリソースを削除しましたが、リソース ファイルはプロジェクトBに残しました。リソースが追加されていなくても、リソース ファイルがプロジェクト内にある場合でも、完全な (不要な) 再構築が行われます。

(.NET 3.5) プロジェクトにリソース ファイルを追加するだけで、Visual Studio 2010 が常にそのプロジェクトを再構築するようです。これはバグですか、それとも意図した/予想される動作ですか?

もう一度ありがとう!

4

17 に答える 17

150

[ツール] - [オプション] を開き、[プロジェクトとソリューション] - [ツリーでビルドして実行] を選択し、[MSBuild プロジェクトのビルド出力の詳細度] を [診断] に設定します。これにより、プロジェクトをビルドする理由が出力されます。

プロジェクト 'ReferencedProject' は最新ではありません。プロジェクト アイテム 'c:\some.xml' の [出力ディレクトリにコピー] 属性が [常にコピー] に設定されています。

また

プロジェクト 'MyProject' は最新ではありません。入力ファイル 'c:\ReferencedProject.dll' は、出力ファイル 'c:\MyProject.pdb' の後で変更されます。

この場合の修正は、新しい場合にのみ some.xml をコピーすることです。

ビルド前およびビルド後のイベントもビルドをトリガーできます。

于 2015-04-15T11:40:06.477 に答える
18

これは修正ではないと思いますが、私の状況ではうまくいった回避策です...

Resources私は当初、セクションを含む 50 のプロジェクトのうち約 5 つのプロジェクトを持っていました。これらのプロジェクトは常に再構築されるため、それらが依存するものもすべて再構築されます。これらの 5 つのプロジェクトの 1 つは、他の 48 のプロジェクトが参照する「ベース」レベルのライブラリでした。したがって、私のプロジェクトの 96% は、必要がなくても毎回再構築されます。

私の回避策は、依存性注入、インターフェース、および専用の「リソース」プロジェクトを使用することでした。これら 5 つのプロジェクトが独自のResourcesオブジェクトを参照する代わりに、必要なリソースを提供するインターフェイスを各プロジェクトに作成しました。次に、これらのリソースを必要とするクラスでは、コンストラクターでの作成中にインターフェイスを渡す必要があります (コンストラクター インジェクション)。

次に、通常のように実際の Resources セクションを持つ別の「Resources」プロジェクトを作成しました。このプロジェクトには、リソース自体と、インターフェイスを介してそれらのリソースを提供するために必要な各インターフェイスのクラスのみが含まれていました。このプロジェクトは、リソースの依存関係を持つ他のすべてのプロジェクトを参照し、プロジェクトが必要とするインターフェイスを実装します。

最後に、何も参照されていない「トップレベル」プロジェクト (および exe が実際にビルドされ、構成ルートが存在する場所) で、「リソース」プロジェクトを参照し、DI を配線して、離れました。

これは、2 つのプロジェクト (「リソース」と「最上位」) のみが毎回再構築されることを意味し、部分的なビルド (Shift-F6) を実行すると、それらはまったく再構築されません。

繰り返しになりますが、回避策としては優れたものではありませんが、毎回 48 個のプロジェクトがビルドされるため、ビルドに約 3 分かかるため、不要なリビルドで 1 日 30 分から 90 分を失っていました。リファクタリングにはしばらく時間がかかりましたが、良い投資だったと思います。

これが簡略化された図です。混乱を避けるために、Main.exeからProj1およびへの依存関係は表示されていないことに注意してください。Proj2

ソリューションの図

この設計では、セクションに依存関係がないため、完全な再構築をトリガーするかどうかにかかわらずProj1、ビルドを実行できます。実装についてのみ知っています。Proj2ResourcesMainResources

于 2013-02-27T20:30:02.577 に答える
17

これは、実際には存在しないファイルがプロジェクトに含まれている場合に発生します。
プロジェクトは、ファイルが変更されたかどうかを判断できないため (存在しないため)、再構築します。

プロジェクト内のすべてのファイルを見て、展開可能な矢印が近くにないファイルを探してください。

于 2014-04-28T12:08:58.097 に答える
4

私の場合、犯人は参照されたdllの「ローカルコピー」設定をtrueに設定し、「出力ディレクトリにコピー」設定してファイルを常にコピーに設定したことでした。

于 2015-11-27T05:38:41.933 に答える
3

.Net Core プロジェクトの場合、上記のすべてのソリューションが機能しません。私は解決策を見つけました。Visual Studio 2019 を使用している場合:

  1. ソリューションを 2 回ビルドする
  2. オンにするTools-> Options-> Projects and Solutions-> SDK-Style Projects-> Logging Level->Verbose
  3. 出力ウィンドウをクリアする
  4. 開始プロジェクトをビルドする
  5. 出力ウィンドウを調べます。で始まるすべての文字列FastUpToDate
  6. プロジェクトを最新の状態にしないプロジェクト アイテムがいくつか見つかります。
  7. これらの問題を修正し、ステップ 1 からやり直してください。修正が正しければ、Build: 0 succeeded, 0 failed, {n} up-to-date, 0 skippedビルド出力の最後の文字列で達成されます。
于 2020-11-29T12:57:59.463 に答える
0

私はあなたと同じ問題を抱えていました。いくつかの削除されたファイルからのものであることがわかりました。プロジェクトからファイルを削除すると、問題はなくなりました。よろしく。

于 2015-01-26T13:58:10.363 に答える
0

あなたの観察に基づいて、明らかではない方法で他のプロジェクトへの依存関係を表現しているプロジェクトがあるようです。孤立した依存関係が、UI に表示されずにプロジェクト ファイルに残る可能性があります。テキスト エディターで開いた後、正しく動作しないプロジェクト ファイルに目を通しましたか? ソリューション ビルドの依存関係を確認しましたか?

何も見つけられない場合は、プロジェクトの 1 つをゼロから再作成して、新しいプロジェクトで同じ問題が発生するかどうかを確認してください。クリーンなプロジェクトが正しくビルドされると、不要な依存関係がどこかに表現されていることがわかります。私が知る限り、makefile やその他の異常なビルド手順がない限り、これらはプロジェクト ファイルまたはソリューション ファイルに含まれている必要があります。

于 2013-02-17T03:37:23.597 に答える
0

このカテゴリのビルドの問題では、MSBuild の出力の詳細度を「診断」に設定することが、実際に必要な最初のステップです。ほとんどの場合、リビルドの理由としては十分に対処できますが、MSBuild は、一部のファイルが変更されているため、コピーする必要があると誤って主張することがあります。

その場合は、NTFS トンネリングを無効にするか、出力フォルダーを新しい場所に複製する必要があります。 ここにもっと言葉があります。

于 2015-08-16T17:58:00.407 に答える
0

Here is an answer from VS2010 always rebuilds solution?

This issue is solved by changing the project files, cleaning solution, deleting all bin folders by hand, restarting Visual studio and rebuilding everything.

于 2013-02-17T01:01:49.380 に答える