Perbedaan antara Rebuild dan Clean + Build in Visual Studio

Jawaban:

308

Rebuild = Bersihkan + Bangun (biasanya)

Detail penting:

  1. Untuk solusi multi-proyek, "membangun kembali solusi" melakukan "bersih" diikuti oleh "membangun" untuk setiap proyek (mungkin secara paralel). Sedangkan "solusi bersih" diikuti oleh "solusi bangun" pertama membersihkan semua proyek (mungkin secara paralel) dan kemudian membangun semua proyek (mungkin secara paralel). Perbedaan dalam urutan peristiwa dapat menjadi signifikan ketika ketergantungan antar-proyek ikut bermain.

  2. Semua tiga tindakan sesuai dengan target MSBuild. Jadi proyek dapat menimpa tindakan Rebuild untuk melakukan sesuatu yang sama sekali berbeda.

pangeran
sumber
2
Jadi Anda mengatakan bahwa Membangun kembali adalah persis sama dengan Clean diikuti dengan Build ? Itu semacam apa yang saya pikirkan, tetapi saya tidak yakin.
Jim McKeeth
43
Kecuali Rebuild membersihkan dan membangun kembali setiap proyek satu per satu. Clean + Build membersihkan semuanya dan kemudian membangun semuanya. Membuat perbedaan besar jika Anda klik dengan kecelakaan :)
Eugene
25
Kecuali karena kurangnya jaminan bahwa mereka sama. Lihat jawaban JaredPar di bawah ini yang dikombinasikan dengan Earl adalah seluruh gambar. Karena Rebuild mengerjakan setiap proyek secara bergantian, Anda dapat memiliki "kasus sudut" ketika informasi ketergantungan Anda kacau dan Anda mendapatkan proyek B yang tidak sesuai pesanan dengan menggunakan proyek lama A lalu membangun kembali A, lalu membangun kembali C. dll. A solusi lengkap Bersih diikuti oleh build solusi lengkap akan menangkap situasi ini sementara pembangunan kembali tidak. Jadi semakin paranoid dan lelah Anda, semakin Anda harus mendukung Bersih daripada Membangun.
Jason Harrison
14
Ini tidak benar. Saya punya proyek di mana Clean + Build berhasil, dan Rebuild mengembalikan kesalahan kompilasi (referensi file melingkar). Jadi mereka tidak 100% sama.
Yaakov Ellis
2
Mungkin karena posting ini semuanya telah berubah, tetapi ada penjelasan mengapa Rebuild tidak (tidak lagi?) Sama dengan clean + build stackoverflow.com/questions/3095901/…
Dave
163

Earl benar bahwa 99% dari waktu Rebuild = Clean + Build.

Tetapi mereka tidak dijamin sama. 3 tindakan (membangun kembali, membangun, membersihkan) mewakili berbagai target MSBuild. Masing-masing dapat ditimpa oleh file proyek apa pun untuk melakukan tindakan kustom. Jadi sangat mungkin bagi seseorang untuk mengganti pembangunan kembali untuk melakukan beberapa tindakan sebelum memulai pembangunan yang bersih (atau menghapusnya seluruhnya).

Sangat banyak kasus sudut tetapi menunjukkan karena diskusi komentar.

JaredPar
sumber
Jika Anda menambahkan tindakan build yang memindahkan file .dll ke lokasi baru, Anda bisa mendapatkan hasil build 'buruk' hanya dengan melakukan pembangunan kembali. Jika Anda mencampur vb.net dan proyek-proyek # c menjadi lebih buruk, desainer formulir rusak dan tidak ada goto yang berfungsi.
CodingBarfield
+1 Perhatikan juga bahwa perilaku Rebuild tampaknya tidak konsisten di semua bahasa sehubungan dengan dependensi: stackoverflow.com/questions/12163080/…
lesscode
1
99% waktu sangat ditaksir terlalu tinggi.
Rhyous
58

Mari kita mendefinisikan implementasi Rebuild default dalam hal implementasi Clean and Build default:

  1. Per proyek: Rebuild project = Clean project + Build project.

  2. Per solusi: Rebuild sln = foreach project in sln (Clean project + Build project).

Perhatikan bahwa karena perbedaan dalam urutan eksekusi, Rebuild sln tidak sama dengan (Clean sln + Build sln) = (proyek foreach di proyek sln Clean) + (untuk proyek foreach di proyek sln Build). Juga, "pendahuluan" ini dapat dieksekusi bersamaan, sehingga tugas yang berbeda diizinkan untuk berjalan secara bersamaan dalam dua skenario.

Katakanlah Anda memiliki sln yang berisi proj1, proj2, dan proj3.

  • Rebuild sln = (Bersihkan proj1 + Build proj1) & (Bersihkan proj2 + Build proj2) & (Bersihkan proj3 + Build proj3)

  • Bersihkan Sln + Bangun Sln = (Bersihkan proj1 & Bersihkan proj2 & Bersihkan proj3) + (Bangun proj1 & Bangun proj2 & Bangun proj3)

+ berarti serial, & berarti bersamaan.

Jadi, jika dependensi proyek tidak dikonfigurasikan dengan benar, ada kemungkinan ketika Anda menjalankan Rebuild sln, beberapa proyek Anda terhubung ke lib basi. Itu karena semua pembersihan tidak dijamin akan selesai sebelum build pertama dimulai. Jika Anda menjalankan Clean sln + Build sln, mereka akan memberikan kesalahan tautan dan memberi tahu Anda segera, alih-alih memberi Anda aplikasi dengan perilaku aneh.

Trout.Z
sumber
7
Yang ini adalah jawaban yang paling tepat, karena itu menjelaskan mengapa kadang-kadang saya tidak bisa membangun kembali, tetapi mampu membersihkan + membangun.
Toan Nguyen
11

Dari http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (cukup googled):

Build berarti mengkompilasi dan menautkan hanya file sumber yang telah berubah sejak build terakhir, sementara Rebuild berarti mengkompilasi dan menautkan semua file sumber terlepas dari apakah mereka berubah atau tidak. Membangun adalah hal yang normal untuk dilakukan dan lebih cepat. Terkadang versi komponen target proyek dapat keluar dari sinkronisasi dan membangun kembali diperlukan untuk membuat pembangunan berhasil. Dalam praktiknya, Anda tidak perlu Bersihkan.

Solusi Build atau Rebuild membangun atau membangun kembali semua proyek dalam solusi Anda, sedangkan Build atau Rebuild membangun atau membangun kembali proyek StartUp, "halo" pada tangkapan layar di atas. Untuk mengatur proyek StartUp, klik kanan pada nama proyek yang diinginkan di tab Solution Explorer dan pilih Set as StartUp project. Nama proyek sekarang muncul dengan huruf tebal. Karena solusi pekerjaan rumah biasanya hanya memiliki satu proyek, Solusi Build atau Rebuild secara efektif sama dengan Build atau Rebuild.

Kompilasi kompilasi saja file sumber yang sedang diedit. Berguna untuk dengan cepat memeriksa kesalahan ketika sisa file sumber Anda dalam keadaan tidak lengkap yang akan mencegah pembangunan yang berhasil dari seluruh proyek. Ctrl-F7 adalah tombol pintas untuk Kompilasi.

Eduardo Mello
sumber
Seperti Toan Nguyen, saya pernah mengalami bahwa kadang-kadang Clean + Build Solution berhasil ketika Solusi Rebuild gagal (mungkin karena ketergantungan antar proyek), jadi jawaban ini menyesatkan, setidaknya pada tahun 2018.
Jon Coombs
4

Dari posting blog ini yang penulis tautkan sebagai komentar pada pertanyaan ini :

Sebenarnya tidak!!! mereka tidak sama.

Perbedaannya terletak pada urutan proyek, bersih dan bangun. Katakanlah kita memiliki dua proyek dalam solusi. Bersih dan kemudian membangun akan melakukan bersih untuk kedua proyek dan kemudian membangun akan terjadi secara individual sementara pada proyek membangun kembali A akan mendapatkan dan membersihkan dan kemudian membangun setelah proyek B akan bersih dan kemudian membangun dan seterusnya.

Prageeth godage
sumber