Visual Studioでのリビルドとクリーン+ビルドの違い


回答:


308

再構築=クリーン+ビルド(通常)

注目すべき詳細:

  1. マルチプロジェクトソリューションの場合、「再構築ソリューション」は「クリーン」を実行し、その後各プロジェクトの「ビルド」を実行します(おそらく並行して)。一方、「クリーンソリューション」の後に「ビルドソリューション」を実行すると、最初にすべてのプロジェクトが(おそらく並列で)クリーンアップされ、次にすべてのプロジェクトが(おそらく並列で)ビルドされます。イベントの順序付けにおけるこの違いは、プロジェクト間の依存関係が関係する場合に大きくなる可能性があります。

  2. 3つのアクションはすべてMSBuildターゲットに対応しています。したがって、プロジェクトはRebuildアクションをオーバーライドして、まったく異なる処理を実行できます。


2
つまり、RebuildCleanの後にBuildが続くのとまったく同じだと言っていますか?そんなことを考えていたのですが、よくわかりませんでした。
ジムマッキース、

43
Rebuildを除き、各プロジェクトをクリーンアップして再ビルドします。Clean + Buildはそれらすべてをクリーンアップしてから、それらすべてをビルドします。偶然にクリックした場合に、ほとんど違いが生じます:)
ユージーン

25
それらが同じであるという保証の欠如を除いて。以下のJaredParの回答を参照してください。これは、Earlと組み合わせると全体像になります。Rebuildは各プロジェクトを順番に実行するので、依存関係情報がめちゃくちゃになり、古いプロジェクトAを使用してBのビルドプロジェクトが順不同になり、次にAを再ビルドし、次にCを再ビルドするなど、「コーナーケース」が発生する可能性があります。完全なソリューションCleanの後に完全なソリューションビルドを実行すると、この状況をキャッチできますが、再ビルドはできません。したがって、偏執的で疲れているほど、Clean次にBuildを優先する必要があります。
Jason Harrison

14
本当じゃない。Clean + Buildが成功し、Rebuildがコンパイルエラー(循環ファイル参照)を返すプロジェクトがありました。したがって、それらは100%同じではありません。
Yaakov Ellis

2
たぶん、この投稿の内容が変更されたためですが、Rebuildがclean + buildと同じではなくなった(もはや?)との説明があります。stackoverflow.com/ questions / 3095901 /…
Dave

163

Earlは正解です。99%の確率でRebuild = Clean + Buildです。

しかし、それらが同じであることは保証されていません。3つのアクション(再構築、構築、クリーン)は、さまざまなMSBuildターゲットを表しています。それぞれのプロジェクトファイルでオーバーライドして、カスタムアクションを実行できます。したがって、クリーン+ビルドを開始する前に(またはそれらを完全に削除する前に)誰かがrebuildをオーバーライドしていくつかのアクションを実行することは完全に可能です。

非常にまれなケースですが、コメントの議論により指摘されています。


.dllファイルを新しい場所に移動するビルドアクションを追加すると、再ビルドを実行するだけで「悪い」ビルド結果を得ることができます。vb.netとc#プロジェクトを混在させると、事態はさらに悪化し、フォームデザイナが機能しなくなり、機能しなくなります。
CodingBarfield、2010

:また、動作が依存関係に対する言語間で一貫していないよう再構築することを+1注stackoverflow.com/questions/12163080/...
lesscode

1
時間の99%は非常に過大評価されています。
Rhyous 2018年

58

デフォルトのCleanおよびBuild実装の観点から、デフォルトのRebuild実装を定義してみましょう。

  1. プロジェクトごと:プロジェクトの再構築=プロジェクトのクリーン+プロジェクトの構築。

  2. ソリューションごと:slnの再構築= foreachプロジェクトをsln(プロジェクトのクリーン+プロジェクトのビルド)。

実行順序の違いにより、slnの再構築は(slnのクリーン+ slnのビルド)=(slnクリーンプロジェクトのforeachプロジェクト)+(slnビルドプロジェクトのforeachプロジェクト)と同じではないことに注意してください。また、この「foreach」は同時に実行される可能性があるため、2つのシナリオで異なるタスクを同時に実行できます。

たとえば、proj1、proj2、proj3を含むslnがあるとします。

  • slnの再構築=(Clean proj1 + Build proj1)&(Clean proj2 + Build proj2)&(Clean proj3 + Build proj3)

  • Clean Sln + Build Sln =(Clean proj1&Clean proj2&Clean proj3)+(Build proj1&Build proj2&Build proj3)

+はシリアルを意味し、&は並行を意味します。

そのため、プロジェクトの依存関係が正しく構成されていない場合、Rebuild slnを実行すると、一部のプロジェクトが古いライブラリにリンクする可能性があります。これは、最初のビルドが始まる前にすべてのクリーンアップが完了するとは限らないためです。Clean sln + Build slnを実行すると、奇妙な動作をするアプリではなく、リンクエラーが発生してすぐに通知されます。


7
これが最も正確な答えです。それは、時々私が再構築できなかったが、クリーン+ビルドできた理由を説明しているためです。
Toan Nguyen

11

http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm、(それをグーグル):

ビルドとは、前回のビルド以降に変更されたソースファイルのみをコンパイルしてリンクすることを意味し、リビルドとは、変更されたかどうかに関係なく、すべてのソースファイルをコンパイルしてリンクすることを意味します。ビルドは通常行うことであり、高速です。プロジェクトターゲットコンポーネントのバージョンが同期しなくなることがあり、ビルドを成功させるために再ビルドが必要になる場合があります。実際には、掃除する必要はありません。

ソリューションのビルドまたは再構築は、ソリューション内のすべてのプロジェクトをビルドまたは再構築します。一方、ビルドまたは再構築は、上記のスクリーンショットの「こんにちは」、スタートアッププロジェクトをビルドまたは再構築します。スタートアッププロジェクトを設定するには、ソリューションエクスプローラータブで目的のプロジェクト名を右クリックし、[スタートアッププロジェクトとして設定]を選択します。プロジェクト名が太字で表示されます。通常、宿題ソリューションにはプロジェクトが1つしかないため、ソリューションのビルドまたは再構築は、ビルドまたは再構築と実質的に同じです。

コンパイルは、現在編集中のソースファイルをコンパイルするだけです。残りのソースファイルが不完全な状態にあり、プロジェクト全体を正常にビルドできない場合に、エラーをすばやく確認するのに役立ちます。Ctrl-F7はコンパイルのショートカットキーです。


同様Toanグエン、私は再構築ソリューション(プロジェクト間の依存関係におそらく)失敗したので、この答えは、少なくとも2018年には、誤解を招くされた場合、時にはクリーン+ビルドソリューションが成功したことを経験した
ジョン・クームス

4

著者がこの質問へのコメントとしてリンクしこのブログ投稿から:

実は違う!!!それらは等しくありません。

違いは、プロジェクトがクリーンでビルドされるシーケンスにあります。ソリューションに2つのプロジェクトがあるとします。クリーンしてからビルドすると、両方のプロジェクトに対してクリーンが実行され、ビルドは個別に行われますが、再構築中は、プロジェクトAが取得およびクリーンしてからビルドし、その後、プロジェクトBがクリーンしてからビルドします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.