Neden Visual Studio Solution dosyaları yerine MSBuild kullanmalıyım?


21

TeamCity'yi sürekli entegrasyon için kullanıyoruz ve sürümlerimizi (.sln) çözüm dosyası aracılığıyla oluşturuyor. Ben geçmişte çeşitli sistemler için Makefiles kullandım ama asla msbuild (duydum Makefiles + XML mashup gibi sorta olduğunu). Çözüm dosyaları yerine doğrudan msbuild'in nasıl kullanılacağına dair birçok gönderi gördüm, ancak neden yapıldığına dair çok net bir cevap göremiyorum .

Öyleyse, neden çözüm dosyalarından MSBuild 'makefile'a geçişi zahmete sokalım? Bir #define (özellikli derlemeler) ile farklılık gösteren birkaç sürümümüz var, ancak çoğunlukla her şey çalışıyor.

Daha büyük endişe, şimdi proje / kaynak kodu eklerken iki sistemi sürdürmemiz gerektiğidir.

GÜNCELLEŞTİRME:

İnsanlar aşağıdaki üç bileşenin yaşam döngüsüne ve etkileşimlerine ışık tutabilir mi?

  1. Visual Studio .sln dosyası
  2. Birçok proje düzeyinde .csproj dosyaları ("alt" msbuild komut dosyalarını anlıyorum)
  3. Özel msbuild betiği

Özel msbuild betiği elle yazılmış ve genellikle varolan tek tek .csproj "olduğu gibi" tüketirken .sln ve .csproj dosyalarının Visual Studio IDE GUI içinden her zamanki gibi tüketildiğini / korunduğunu söylemek güvenli mi? Bakımda çakışma / yinelenmeyi azaltmanın bir yolu budur ...

Diğer milletlerin operasyonel deneyimlerinden buna ışık tutabilirim


So, why should we bother migrating from solution files to an MSBuild 'makefile'?Öncelikle neden bunu düşündüğünüzü söylemelisiniz? Çözüm dosyası yeterli değil mi?
jgauffin

3
Çünkü daha iyi bir uygulama olduğu söyleniyor. Son sorunuz için; belki öyle, belki değil. Bu yüzden bu soruyu daha net bir cevap için araştırın.
DeepSpace101

2
Because it's reputed to be better practicenerede?
jgauffin

3
IDE'nin (sln dosyası) derlemeden ayrılması kesinlikle iyi bir SE tasarımıdır. Jeff, detayları isterseniz codinghorror.com/blog/2007/10/… adresinde yazdı . Ayrıca, sadece derlemeyi derlemek yerine sürüm oluşturma komut dosyasının bir parçası olarak testleri ve hatta yazılım paketini (setup.exe veya msi) tetiklemek güzeldir.
DeepSpace101

Yanıtlar:


16

İlk nokta, MSBuild yürüttüğünde çözüm dosyasının hemen hemen sihirli bir şekilde MSBuild dosyası haline gelmesidir - bu, çözümü görsel stüdyoda oluşturduğunuzda olan şeydir. Buna ek olarak, tüm bu proje dosyaları sadece visual studio tarafından yönetilen msbuild dosyalarıdır. Aslında, çözümlerden ya da özel bir msbuild komut dosyasından olsanız da, proje dosyaları gerçek kirli işlerin çoğunu işliyor.

TeamCity'i uygulama oluşturmak ve yayınlamak için de kullanırız ve çoğu proje için genellikle özel msbuild komut dosyaları oluştururuz. Bu komut dosyalarının (bir çözüm dosyasıyla gerçekten kolay olmayan) oynadığı rol, projeyi dağıtım veya dağıtım için paketlemektir. Genellikle bu komut dosyaları, web projesini belirli bir klasöre oluşturmak veya geliştirme yapılandırmalarının aksine çalışan yapılandırmalara kopyalamak gibi bazı daha işlevsel yönleri ele alır. Ağır kaldırma, proje dosyalarının kendisinde ele alınma eğilimindedir - derleme betiği sadece bunlara referans verir, o tekerleği yeniden oluşturmaya çalışmayız. Genel olarak harika çalışıyor ve gerçekten çoğaltılmış kod değil.


Yani Visual Studio'da sln + csproj kullanın ve sonra aynı olan csproj's + özel msbuild komut dosyası oluşturma sunucusunda aynı? Soruyu biraz açıkladım. Teşekkürler!
DeepSpace101

Evet, işlevsel olarak aynılar.
Wyatt Barnett

15

Msbuild için Makefile olan .Sln dosyası (veya vcproj dosyası).

Tipik bir msbuild komut satırı şuna benzer:

msbuild /p:Configuration=Release BigProject.sln

Msbuild kullanmanın amacı, derleme sürecini kodlamak ve otomatikleştirmek. Farkında olsanız da olmasanız da, TeamCity baştan beri msbuild kullanıyor.


İkinci kısım, çeşitli bileşenlerin potansiyel çakışması hakkında ne düşünüyorsunuz? Ben (umarım!) Soruyu biraz daha açıkladım ... thx
DeepSpace101

3

Bu soruyu ele alalım.

Kesinlikle .SLN dosyanızı 'oluşturma işlemi' olarak kullanabilmenize rağmen, dosyanın kendisi gerçekten bir oluşturma işlemi oluşturmaz. Çözüm dosyası gerçekten Visual Studio'nun sadece bir parçasıdır ve geliştirme için kullanılır. Ancak Visual Studio derleme ve yayınlama sürecinin sadece bir parçasıdır. Yapınızı yönetmek için Çözümlere güvenemezsiniz ve Çözümler kesinlikle ölçeklenebilir bir yapı durumu sunmaz.

Bir inşa süreci kurmanın tüm amacı, güvenilir binalar oluşturmaktır. Yani, derleme işlemi o kadar güvenilirdir ki derleme yapılandırması ne olursa olsun, tahmin edilebilir bir derleme çıktısı alırsınız. Her zaman, her makine. Öngörülebilir ve güvenilir bir yapının sonucu, test, devreye alma ve serbest bırakma işleminin yüksek derecede otomatikleştirilebilmesi ve böylece insan hatası riskini daha da azaltmasıdır.

Bir inşa süreci oluşturmak bir yatırım gerektirir, ancak bazı durumlarda yatırım gerekir. Msbuild sürecini destekleyen bazı faktörler şunlardır:

  • Ürününüzde aynı ekip projesinde çalışan birden fazla ekip (işlevler arası veya başka türlü) var
  • Kuruluşunuzda yalnızca bir ekip projesi var (geleneksel mağazaların% 99'unda, hatta 200'den fazla geliştiricisi olanlarda bile)
  • İnşa edilmesi gereken, bazıları başkalarına bağımlı olan ve farklı ekipler tarafından sürdürülen 20'den fazla projeniz var
  • Ürününüz birden fazla .NET teknolojisi (C #, C ++, VB, F #, ASP.NET, vb.) Veya hatta .NET dışı teknolojiler (Grunt, düğüm, npm, Java, vb.)
  • Ürününüz ağır ağırlık bağımlılıklarına sahiptir veya ağır ağırlık platformunun üzerine kurulmuştur. Örnek olarak SharePoint

Son noktayı genişletmek için bir örnek vereyim. Mevcut şirketim SharePoint geliştiriyor. SharePoint geliştirmeleri, SharePoint projelerinde derlemeler gerçekleştirmek için SharePoint temelinin yüklenmesini gerektirir. Hafif bir yapı sunucusu açısından, yapı sunucusunun SharePoint'in yüklü olmasını gerektirmek tamamen pratik değildir. SharePoint yalnızca yüksek gereksinimleri olan bir canavar değil, aynı zamanda bir yapı üzerinde ciddi performans etkileri olacaktır - ve yapıların mümkün olduğunca hızlı ve yalın olması gerekir. MSBuild'den yararlanmak derleme sunucusundaki bu yükleme gereksinimini ortadan kaldırmamı sağlıyor. Aslında, derleme sunucumuzun .NET çerçevesi (MSBuild için gereklidir) ve Düğüm dışında herhangi bir yükleme gereksinimi yoktur.

Referans olarak, bu kitabı Sayed Ibrahim Hashimi tarafından kontrol etmenizi tavsiye ederim: http://www.amazon.com/Inside-Microsoft-Build-Engine-Foundation/dp/0735645248/ref=sr_1_fkmr0_1?ie=UTF8&qid=1412014650&sr= 8-1-fkmr0 & anahtar kelimeler = msbuild + güvenilir + inşa


1
Sln dosyaları yerine msbuild dosyalarını kullanmanın, yapı sunucusuna SharePoint'i yüklemek zorunda kalmama ne ilgisi var? Bunlar tamamen ilgisiz kavramlardır. Çözüm dosyası hiçbir şeye bağımlı değildir. Ayrıca, yapınızı yönetmek için çözüm dosyalarına kesinlikle güvenebilirsiniz, çünkü şirketimiz yıllardır sorunsuz çalışıyor. Çözüm dosyalarını da destekleyen msbuild aracının kendisi ile çözüm ve msbuild dosyalarını karıştırıyor olabileceğinizi düşünüyorum. Yapım makinesindeki çözümü derlemek için visual studio kullanmıyoruz.
julealgon

"Kuruluşunuzun yalnızca bir ekip projesi var" açıklamanız için +1. Birden fazla Ekip Projesini kullanan insanları bu küçük dükkanlarda 'ürünler' veya 'projeler' gibi şeyler için sınır olarak görmek beni acıtıyor. Tek takım proje yaklaşımını aldım ve umarım geri dönmek zorunda kalmayacağım.
JohnZaj

2

Bu tam olarak kendime birkaç ay önce sorduğum soru! Her şey güzel ayarlanmıştı:

  • Depoların kökünde güzelce çözüm dosyası
  • Teamcity'de yapılandırılmış adımları oluşturun.
    • NuGet paketlerini geri yükle
    • Yapı çözümü
    • Birim Testlerini Çalıştırma
    • Kurulum entegrasyonu test ortamı
    • Entegrasyon testlerini çalıştırın
    • Yırtma entegrasyonu test ortamı
    • Dağıtım paketi oluşturma
    • Taşıma komut dosyası oluşturma

Ve sonra, tekrarlanabilirlik söz konusu olduğunda, bunun düşük olduğu ortaya çıktı. TeamCity'nin derleme betiğiniz olmasına izin verdiğinizde, kendi geliştirme makinenizde güvenilir, benzer sonuçlar üretmek zorlaşır.

Bir yapı komut dosyanız olduğunda, yapı komut dosyası yapılması gereken her şeyi bilir ve tüm değişkenleri yerinde tutar. Derleme komut dosyası olarak bir CI sunucusu kullandığınızda ve karmaşık bir testin başarısız olması veya bir dağıtım paketini el ile oluşturması (örneğin örneğime göre) gibi bazı sorunlar oluşursa, derlemenin tüm adımlarını el ile bir araya getirmeniz gerekir.

Yani, Short , neden (MS) script kurmak? Çünkü derleme söz konusu olduğunda daha fazla gereksinime sahip olacaksınız. Muhtemelen bazı testler yapmak ve bundan bazı eserler yaratmak istiyorsunuz. Muhtemelen dağıtım yapmak istiyorsunuz. Ve bir yapı sunucusunda veya makinenizde olsun, istediğiniz her şeyin çalıştırılabilir olması gerektiğinde, bir yapı komut dosyasında değil, hiçbir yerde bitemez.


1
++ Bugün bu iddiamızla baş başa kaldım. Yapınız yalnızca bazı bulut hizmetlerinde bir GUI değil , her yerden çalıştırılabilir olmalıdır .
RubberDuck
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.