Visual Studio'da Yeniden Oluştur ve Temizle + Oluştur arasındaki fark


Yanıtlar:


308

Rebuild = Clean + Build (genellikle)

Dikkate değer detaylar:

  1. Çok projeli bir çözüm için, "yeniden oluşturma çözümü" her proje için bir "temiz" ve ardından bir "yapı" (muhtemelen paralel) yapar. Oysa "temiz çözüm" ve ardından "derleme çözümü" önce tüm projeleri (muhtemelen paralel olarak) temizler ve sonra tüm projeleri (muhtemelen paralel olarak) oluşturur. Olayların sıralanmasındaki bu fark, projeler arası bağımlılıklar devreye girdiğinde önemli hale gelebilir.

  2. Her üç eylem de MSBuild hedeflerine karşılık gelir. Böylece proje tamamen farklı bir şey yapmak için Yeniden Oluştur eylemini geçersiz kılabilir.


2
Yani, Rebuild'in bir Temiz ve ardından bir Yapım ile tamamen aynı olduğunu mu söylüyorsun ? Ben de öyle düşündüm, ama emin değildim.
Jim McKeeth

43
Yeniden oluşturma dışında her projeyi tek tek temizler ve yeniden oluşturur. Clean + Build hepsini temizler ve sonra hepsini oluşturur. Çoğunlukla kazara tıklatırsanız fark yaratır :)
Eugene

25
Aynı olduklarını garanti etmemek dışında. Aşağıdaki Earl's ile birleştirilen JaredPar'ın cevabının tamamına bakın. Rebuild her projeyi sırayla gerçekleştirdiğinden, bağımlılık bilgileriniz bozulduğunda bir "köşe vakası" olabilir ve eski A projesini kullanarak B'yi sonra B'yi derhal yapıp C'yi yeniden oluşturursunuz. A tam çözüm Temiz ve ardından tam bir çözüm derlemesi bu durumu yakalar, ancak yeniden oluşturma olmaz. Bu yüzden ne kadar paranoyak ve yorgun olursanız, Clean ve Build'a karşı o kadar çok tercih etmeniz gerekir.
Jason Harrison

14
Bu doğru değil. Clean + Build'ın başarılı olduğu bir projem oldu ve Yeniden Oluştur derleme hataları döndürdü (dairesel dosya başvuruları). Yani% 100 aynı değiller.
Yaakov Ellis

2
Belki bu gönderi değiştiğinden, ancak Rebuild'in neden temiz değil (build?) İle aynı olmadığına dair bir açıklama var stackoverflow.com/questions/3095901/…
Dave

163

Earl, zamanın% 99'unun Rebuild = Clean + Build olduğunu doğruladı.

Ancak aynı oldukları garanti edilmez. 3 eylem (yeniden oluşturma, oluşturma, temizleme) farklı MSBuild hedeflerini temsil eder. Her biri özel eylemler yapmak için herhangi bir proje dosyası tarafından geçersiz kılınabilir. Bu nedenle, bir kişinin temiz + derleme başlatmadan (veya tamamen kaldırmadan) önce birkaç eylemi gerçekleştirmesi için yeniden oluşturmayı geçersiz kılması tamamen mümkündür.

Çok köşe bir dava ama yorum tartışmalar nedeniyle işaret.


.Dll dosyalarını yeni bir konuma taşıyan oluşturma eylemleri eklerseniz, yalnızca yeniden oluşturma yaparak 'kötü' oluşturma sonuçları alabilirsiniz. Bir vb.net ve c # proje karıştırırsanız işler daha da kötüleşir, kırık form tasarımcıları ve hiçbir çalışma goto.
CodingBarfield

+1 Ayrıca, yeniden oluşturma davranışının bağımlılıklara göre diller arasında tutarlı görünmediğine dikkat edin: stackoverflow.com/questions/12163080/…
lesscode

1
Zamanın% 99'u çok fazla tahmin ediliyor.
Mart'ta Rhyus

58

Varsayılan Yeniden Oluşturma uygulamasını varsayılan Temizleme ve Oluşturma uygulamaları açısından tanımlayalım:

  1. Proje başına: Proje yeniden oluştur = Proje temizle + Proje oluştur.

  2. Çözüm başına: sln = sln = foreach projesini yeniden oluştur (Clean project + Build project)

Yürütme sırasındaki farklılıklar nedeniyle, Rebuild sln öğesinin (Clean sln + Build sln) = (sln Clean projesinde foreach projesi) + (sln Build projesinde foreach projesi) ile aynı olmadığını unutmayın. Ayrıca, bu "foreach" eşzamanlı olarak yürütülebilir, bu nedenle farklı görevlerin iki senaryoda eşzamanlı olarak çalışmasına izin verilir.

Diyelim ki proj1, proj2 ve proj3 içeren bir sln'niz var.

  • Yeniden oluştur = (Proj1'i temizle + Proj1'i oluştur1) & (Proj2'yi temizle + Proj2'yi oluştur) & (Proj3'ü temizle + Proj3'ü oluştur)

  • Temiz Sln + Derleme Sln = (Temiz proj1 & Temiz proj2 & Temiz proj3) + (Proj1 derleme & Proj2 derleme ve proj3 derleme)

+ seri anlamına gelir ve eşzamanlı anlamına gelir.

Dolayısıyla, proje bağımlılıkları doğru şekilde yapılandırılmazsa, Rebuild sln komutunu çalıştırdığınızda, bazı projelerinizin eski bir lib'e bağlanma ihtimali vardır. Bunun nedeni, tüm yapıların ilk yapı başlamadan önce bitirilmesinin garanti edilmemesidir. Clean sln + Build sln çalıştırırsanız, size bir bağlantı hatası verir ve size garip davranışları olan bir uygulama vermek yerine bunu hemen bildirir.


7
Bu en kesin cevaptır, çünkü bazen neden yeniden inşa edemediğimi açıklıyor, ancak temizleyebiliyordu.
Toan Nguyen

11

Gönderen http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (sadece googled):

Oluştur, yalnızca son derlemeden bu yana değişen kaynak dosyaları derlemek ve bağlamak anlamına gelirken, Yeniden Oluştur, değiştirilip değiştirilmediklerinden bağımsız olarak tüm kaynak dosyaları derlemek ve bağlamak anlamına gelir. Yapı normal bir şeydir ve daha hızlıdır. Bazen proje hedefi bileşenlerinin sürümleri senkronizasyondan çıkabilir ve yapının başarılı olması için yeniden oluşturma gerekir. Uygulamada, asla Temizlemenize gerek yoktur.

Derleme veya Yeniden Oluşturma Çözümü, çözümünüzdeki tüm projeleri oluşturur veya yeniden oluştururken, Derleme veya Yeniden Oluşturma yukarıdaki ekran görüntüsünde "merhaba" olan StartUp projesini oluşturur veya yeniden oluşturur. Başlangıç ​​projesini ayarlamak için, Çözüm Gezgini sekmesinde istediğiniz proje adına sağ tıklayın ve Başlangıç ​​projesi olarak ayarla'yı seçin. Proje adı artık kalın yazılmıştır. Ev ödevi çözümlerinin genellikle yalnızca bir projesi olduğundan, Derleme veya Yeniden Oluşturma Çözümü derleme veya Yeniden Oluşturma ile aynıdır.

Derleme sadece o anda düzenlenmekte olan kaynak dosyayı derler. Kaynak dosyalarınızın geri kalanı eksik olduğunda ve tüm projenin başarılı bir şekilde oluşturulmasını engelleyecek hataları hızlı bir şekilde kontrol etmek için kullanışlıdır. Ctrl-F7, Compile için kısayol tuşudur.


Toan Nguyen gibi, bazen Clean + Build Solution'ın bir Yeniden Oluşturma Çözümünün başarısız olduğu (muhtemelen projeler arası bağımlılıklar nedeniyle) başarılı olduğunu deneyimledim, bu yüzden bu cevap en azından 2018'de yanıltıcı.
Jon Coombs

4

Gönderen bu blog yayınında yazar olarak bağlantılı bu soruya yaptığı yorumda :

Aslında hayır!!! eşit değiller.

Aradaki fark, projelerin temizlenip inşa edilmesidir. Diyelim ki bir çözümde iki projemiz var. Temiz ve sonra derleme her iki projeye de temiz performans gösterecek ve sonra yeniden inşa projesi A sırasında tek tek gerçekleşecek ve bu proje B temizlenecek ve sonra derlenecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.