NAnt veya MSBuild, hangisini ve ne zaman seçilir?


160

Stack Overflow ile ilgili diğer NAnt ve MSBuild ile ilgili sorular olduğunu biliyorum, ama ikisi arasında doğrudan bir karşılaştırma bulamadık ve işte burada soru.

Ne zaman MSBuild üzerinde NAnt seçmeliyim? Hangisi ne için daha iyidir? NAnt ev / açık kaynak projeleri ve MSBuild iş projeleri için daha uygun mudur? İkisinden herhangi birinin deneyimi nedir?

Yanıtlar:


97

Bu hafta benzer bir soruşturma yaptım. İşte belirleyebildiklerim:

NAnt:

  • Çapraz platform (Linux / Mono'yu destekler). Örneğin, bir web sitesini birden çok hedefe (Linux Apache ve Windows IIS) yüklemek yararlı olabilir.
  • Sözdiziminde Ant'e% 95 benzer (mevcut Ant kullanıcıları veya Java üreticileri için kolay)
  • Yapının bir parçası olarak birim testleri çalıştırmak için NUnit ve dokümantasyon üretmek için NDoc ile entegrasyon.

MSBuild:

  • .NET için yerleşik.
  • Visual Studio ile entegre
  • Visual Studio'da MSBuild ile çalışmaya başlamak kolaydır - her şey perde arkasında. Daha derine inmek istiyorsanız, dosyaları elle düzenleyebilirsiniz.

Öznel Farklılıklar: (YMMV)

  • NAnt belgeleri biraz daha basittir. Örneğin, MSBuild Görev Başvurusu "Csc Görevi - Csc görevini ve parametrelerini açıklar." ("Yardım" için teşekkürler?) Ve NAnt Görev Başvurusu "csc - C # programlarını derler." GÜNCELLEME: MSBuild belgelerinin geliştirildiğini ve şimdi çok daha iyi olduğunu fark ettim (muhtemelen NAnt ile eşit).
  • Doğrudan Visual Studio içinden derleme komut dosyası kaynağını (*. * Proj dosyası) nasıl düzenleyeceğinizi anlamak kolay değil. NAnt ile ben sadece Visual Studio .build komut dosyasını bir XML dosyası olarak tedavi var.
  • Görünüşe göre, Visual Studio'da, Web Uygulama Projeleri varsayılan olarak bir *. * Proj dosyası almazlar, bu yüzden bir dağıtım komut dosyası oluşturmak için MSBuild'in benimkini çalıştırmasını nasıl bulacağımı anlamakta büyük zorluk yaşadım.
  • NAnt, Visual Studio'da yerleşik değildir ve bir Eklenti ile veya "Harici Araç" olarak eklenmesi gerekir. Bu, kurulması biraz acıdır.
  • (Düzenle :) İş arkadaşlarımdan biri bunu getirdi - sürekli entegrasyon için CruiseControl kullanarak bir yapı makinesi kurmak istiyorsanız , CruiseControl NAnt ile kutudan güzel bir şekilde entegre olur. GÜNCELLEME: CruiseControl'ün bir MSBuild görevi de vardır .
  • Sübjektif farklılıkların tam ve güncel tartışması için lütfen aşağıdaki yorumlara bakınız.

bir .proj dosyasını düzenleyebilirsiniz, ancak projeyi kaldırdıktan sonra (projenin içerik menüsünde bir "Kaldır" seçeneği olmalıdır)
Yordan Pavlov

18
@Yordan: veya özelleştirmelerinizi ayrı bir .build dosyasına (veya her neyse) koyun ve bunu .csproj dosyanızdan içe aktarın + yürütün. Daha sonra .csproj dosyasını yalnızca bir kez düzenlemeniz gerekir ve .build dosyasını çözümünüze ekleyebilirsiniz. Çift tıklayın ve diğer dosyalar gibi düzenleme yapıyorsunuz. Seçeneklerinizi .build dosyalarını XML düzenleyicisine eşleyebilir.
Kent Boogaart

9
Bir MSBuild CCNet görevi var - Ayrıntılar şu adreste bulunabilir: confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Gavin Miller

2
.Csproj dosyalarını kendiniz değiştirmeniz gerekmediğini belirtmek gerekir. Bu değişiklikleri yapmak için bir MyProject.csproj.user dosyası kullanabilirsiniz .csproj dosyanızı temiz ve bozulmamış olarak bırakabilirsiniz. MSBuild bu .user dosyalarını aramayı bilir ve otomatik olarak derleme işlemine aktarır. Bkz: ahmed0192.blogspot.com/2006/11/...
CleverPatrick

3
@CleverHuman, bu .user dosyası normalde projenin geri kalanıyla birlikte normalde kontrol etmeyeceğiniz kullanıcıya özgü modlar içermiyor mu? Kent'in önerisini yıllardır kullandım ve çok güzel çalışıyor. PROJ dosyasını ikinci bir PROJ dosyası içerecek şekilde bir kez değiştirin, ardından ikinci PROJ dosyasını projenize ekleyin. O andan itibaren, bu Kaldırma / yeniden yükleme işleminden geçmeden ikinci PROJ dosyasını kolayca özelleştirebilirsiniz. Sadece bu nedenle MSBuild'e yöneliyorum.
DarinH

77

Benim için MSBuild'in en önemli çizimlerinden biri (Windows platformlarında) .NET'in bir parçası olarak gelmesidir. Bu, Windows Update ile güncel olan tüm Windows makinelerinde MSBuild'in kullanılabileceği anlamına gelir. Buna, C # derleyicisinin de .NET'in kendisinin bir parçası olduğu ve temiz makinelerde projeler oluşturabilecek bir platformunuz olduğu gerçeğini ekleyin. Visual Studio behemoth yüklemenize gerek yok. Öte yandan NAnt, bir yapı tetiklenmeden önce açıkça kurulmalıdır.

Sadece kayıt için, geçmişte önemsiz olmayan yapılarda (o sırayla) NMake, Make, Ant, Rake, NAnt ve MSBuild kullandım. My favourite MSBuild, eller aşağı (ve ben bunu sevmiyorum çünkü "Visual Studio bunu kullanır"). IMHO, çok az takdir edilen bir yapı aracıdır.

NAnt ve MSBuild'i yordamsal ve işlevsel programlama arasındaki farkla karşılaştırırdım. NAnt oldukça basittir ve ne görürsen onu alırsın. Öte yandan MSBuild biraz daha düşünmeyi gerektirir. Öğrenme eğrisi daha diktir. Ama bir kez "anladın", onunla inanılmaz şeyler yapabilirsin.

Bu nedenle, işlevsel veya mantıksal stil programlamaya da yönelirseniz MSBuild'e bakmanızı tavsiye ederim - somut sonuçları görmeden önce biraz zaman ve çaba harcamak istiyorsanız (elbette, yatırımın nihayetinde işe yaradığını ve daha güçlü şeyleri daha verimli yapabilir).


11
Vaov! MSBuild'in çalışma zamanı ile birlikte geldiğini bilmiyordum. Bu oldukça havalı ve kesinlikle faydaları görebiliyorum. Ancak fonksiyonel / prosedürel karşılaştırmayı anlamıyorum. Biri "aldığında" MSBuild'i bu kadar güçlü kılan şeyleri duymak ilginç olurdu.
Scott Saad

2
Msbuild aslında sadece belirli hedeflerin çağrılması sırasında belirgin hale gelen çeşitli SDD'lerden gelen dosyalara bir dizi bağımlılığa sahiptir. Bu nedenle, msbuild kutunun dışında kullanılabilir olsa da, çalışmayabilir.
Sam Shiles

6
eklenmesi gereken bir şey: sadece msbuild içinden .NET derlemelerini çağırmak mümkün değildir, bu da çok sayıda kullanışlı işleve tek bir erişim sağlar (örneğin Systme.IO.Path'teki her şey derleme komut dosyalarında kullanışlı olabilir) , msbuild dosyalarına düz C # kodu yazmak ve çalıştırmak da mümkündür. Bu sadece şaşırtıcı. msdn.microsoft.com/tr-tr/library/dd722601.aspx Ve işler çok karmaşık hale gelirse, özel görevler yazmak da çok kolaydır .
stijn

1
Wikipedia'dan: " MSBuild daha önce .NET Framework ile birlikte gelirken , Visual Studio 2013'ten başlayarak bunun yerine Visual Studio ile birlikte gelir."
DavidRR

MSBuild (Microsoft Yapı Araçları 2013) da Visual Studio 2013 bağımsız indirilebilir burada .
DavidRR

45

Şahsen, her ikisini de kullanıyorum - aynı proje için.

MSBuild, Visual Studio çözümleri ve projeleri oluşturmada harikadır - bunun için yapılır.

NAnt daha kolay elle düzenlenebilir, bence - özellikle Ant'i zaten biliyorsanız. NAnt, MSBuild'i NAntContrib ile kolayca arayabilir. Yani, el yapımı dosyaları kopyalama, temizleme vb. Gibi şeyler yapmak için bir NAnt komut dosyası el - ve MSBuild gerçek "benim C # kaynak kodunu derlemeler haline" bölümü yapmak için çağırır.

Bunun bir örneğini istiyorsanız, Protocol Buffers derleme dosyasına bakın . (Harika bir NAnt betiği olduğunu iddia etmem, ancak işi yapar.)


1
Ve Mono'yu destekliyor. Mono'nun MSBuild desteği boktan.
Mehrdad Afshari

@Mehrdad: Evet, bir noktada gerçekten Protokol Tamponları'nı Mono'da derlemeye çalışmalıyım ... şu anda çalışmasını engelleyen bir gmcs hatası var :( Fikir her zaman sonunda Mono üzerinde çalışacaktı.
Jon Skeet

1
Çocuklar, mono XBuild kullanır ve MSBuild'i XBuild'e taşımak kolaydır. Şuna bir göz atın: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
fyasar

20

NAnt kutudan daha fazla özelliğe sahiptir, ancak MSBuild çok daha iyi bir temel yapıya (öğe meta veri kayaları) sahiptir, bu da yeniden kullanılabilir MSBuild komut dosyaları oluşturmayı çok daha kolay hale getirir.

MSBuild'in anlaşılması biraz zaman alıyor, ancak bir kez yaptıktan sonra çok güzel.

Öğrenme materyalleri:


38
Hey, bu kitapları duydum :)
Sayed Ibrahim Hashimi

19

KISS = MSBuild kullanın.

Kutunun dışında makul bir iş yapacak bir şeye sahipken neden karışıma başka bir şey eklemelisiniz? MSBuild geldiğinde NAnt öldü. Ve Mono bir MSBuild uygulanmasını (olacak XBUILD ).

DRY = MSBuild kullanın.

Kendinize bir yapı sisteminden ne istediğinizi sorun. İki farklı yapılandırmayı korumak yerine IDE tarafından da kullanılan bir yapı sistemi istiyorum .

Şahsen, NAnt için bazı gerçek argümanlar duymak isterim, çünkü gerçekten su tutan herhangi bir şey düşünemiyorum.


2
"Msbuild arived, nant öldü" - Ben VS olmadan bile (bu kullanmıyorum) bu kattığı olduğunu düşünüyorum.
harpo

Katılıyorum. DotNet 1.1 msbuild.exe yoktu. O zaman geri vidalandık. 2.0'dan bu yana, msbuild.exe ve ekstra kitaplıklar çok şey yapar. Ve özel bir MsBuild-Task yazmanın bir öğrenme eğrisi var, ancak yıllar boyunca yaklaşık 10 tane yazdım.
14:48

1
Kabul etmeliyim, yapı sunucusunun daha hızlı başarısız olmanıza izin verecek şekilde geliştirici olarak oluşturmak için aynı aracı kullanmalısınız.
krystan onur

14

Birkaç poster bahsetti fark bir şey .csproj (veya .vbproj, vb.) Dosyaları el düzenlemek zorunda kaldı.

MSBuild bu. * Proj dosyalarının .user dosyaları kullanılarak özelleştirilmesine izin verir. MyCreativelyNamedProject.csproj adlı bir projem varsa ve içindeki MSBuild görevlerini özelleştirmek istiyorsanız, MyCreativelyNamedProject.csproj.user adlı bir dosya oluşturabilir ve bu dosyaları özelleştirmek için CustomBeforeMicrosoftCommonTargets ve CustomAfterMicrosoftCommonTargets kullanabilirsiniz.

Ayrıca, NAnt ve MSBuild, özel MSBuild görevleri ve NantContrib uzantıları aracılığıyla kalbin içeriğine göre özelleştirilebilir.

Yani, NAnt veya MSBuild kullanmak gerçekten tanıdık geliyor:

  • Ant'e zaten aşina iseniz NAnt kullanın. Öğrenme eğrisi çok kolay olacaktır.
  • Her iki araca da aşina değilseniz, MSBuild zaten Visual Studio ile entegre edilmiştir ve ek bir araç gerektirmez.

Ayrıca, MSBuild'in piyasaya sürülür çıkmaz tüm yeni .NET ve Visual Studio sürümleriyle çalışacağının garanti edildiğini eklemeye değer , oysa NAnt'ın biraz gecikmesi olabilir.


1
.Net sürümleri ile nant sürümleri arasındaki gecikmeye işaret etmek için +1. Ne zaman .net 3.5 çıktı ve işler çalışmak için 'ağları üzerinden bir kesmek nant.exe.config kullanmak zorunda hatırlıyorum. Eğlenceli değil.
mmacaulay

9
Buradaki birçok gönderiye göre, bu .USER dosyaları teslim edilmemesi gereken + kullanıcıya özgü bilgiler + içerir, bu yüzden derleme özelleştirmeleri koymak istediğim son yer olurdu ... Tanım gereği herhangi bir derleme özelleştirmesi gerekir. kullanıcıya özgü değildir ve bu nedenle bu .user dosyalarına girilmemelidir ...
DarinH

1
Drventure ile aynı fikirde; .user-dosyaları adın pr kullanıcısına önerdiği gibidir ve hatta kaynak denetim deponuza teslim edilmemelidir. Bu yapı otomatikleştirmek için bir yer değil.
Kjetil Klaussen

10

Her ikisi de benim NAnt komut dosyaları MSBuild çağırmak kullanın . Nant ile kalmak için benim ana nedeni izolasyon olduğunu . Bunun neden önemli olduğunu düşündüğümü açıklayayım:

  1. Projenize bağımlılıklar ekleme. NAnt yapı dosyası Visual Studio yabancı (benim durumumda bu bir profesyonel olarak kabul) böylece Visual Studio onunla hiçbir şey yapmaya çalışmaz. MSBuild görevleri, çözümün bir parçası olarak katıştırılır ve diğer MSBuild görevlerine başvurabilir. MSBuild topluluk görevleri yüklü olmadığından öğrenmek için başka birinden kaynak kod aldım. Ne özellikle sinir bozucu buluyorum Visual Studio sadece inşa ve beni hata ayıklama zaman gevşek yapan bir sürü hata atmak değil olmasıdır. Bu, istenen yapının MSBuild görevinin bazı ekstraları olmadan ilerleyebilmesine rağmen (örneğin bir hata ayıklama yapısı olarak). Kısacası: Eğer önleyebilirsem projeme bağımlılık eklemekten hoşlanmam .

  2. Geliştirme ekibini atabildiğim kadarıyla Visual Studio'ya güvenmiyorum. Bu, HTML'imi katlettiği Visual Studio'nun ilk günlerine kadar uzanıyor. Örneğin hala tasarımcıyı kullanmıyorum (son zamanlarda bir konferansta meslektaşlarının da aynı şeyi yaptığını gördüm). Visual Studio, DLL dosyasında bağımlılıkları ve sürüm numaralarını berbat edebileceğini buldum (bunu kopyalayamıyorum, ancak sürekli bir projede gerçekleşti ve çok fazla keder ve zaman kaybına neden oldu). Yalnızca hata ayıklama modunda oluşturmak için Visual Studio kullanan bir oluşturma yordamına başvurdum. Üretim için NAnt kullanıyorum, böylece her şeyi dışarıdan kontrol ediyorum . Ben NAnt kullanarak oluşturmak Visual Studio artık müdahale edemez.

Not: Ben bir web geliştiricisiyim ve Windows Forms geliştirme yapmıyorum.


6

MsBuild'e çok aşina olmasam da, her iki taraftaki bazı önemli farklılıkların ilavelerle desteklenebileceği izlenimindeyim:

Geçenlerde Nant'ta bir Silverlight projesi yapmak zorunda kaldım. Sadece bunu MsBuild ile yapsaydım hayatın daha kolay olacağını keşfettim - Nant betiğinden bir MsBuild görevi çağırdı, bu yüzden ikisini karıştırmak ve eşleştirmek için çok sıra dışı olmadığını varsayalım.

Bunun ötesinde, kişisel bir tercih meselesi olacağını düşünüyorum - açıkçası, MsBuild'in işlevlerinin bir kısmını / çoğunu Visual Studio içinden yönetebilirsiniz, eğer işiniz buysa. Komut dosyalarını el ile yazmayı tercih ederseniz Nant daha esnek ve daha uygun görünüyor ve Java dünyasından geliyorsanız, muhtemelen onunla evde olacaksınız.


İyi bir nokta. Her iki çözüm de istenilen şekilde genişletilebilir ve özelleştirilebilir.
CleverPatrick

2

Her ikisini de kullandım. Yapı sistemimizi yeniden tasarlarken zor bir sorunla karşı karşıyaydım. Yani .vcproj (ve aile) 'den kurtulamadım çünkü herkes proje dosyalarını, ayarları ve yapılandırmaları güncellemek için VS kullanıyordu. Bu nedenle, büyük bir çoğaltma ve hataya eğilimli işlem olmadan, derleme sistemimizi yeni bir dosya kümesine dayandıramadık.

Bu nedenle, VS 'proj' dosyalarını tutmaya ve MSBuild kullanmaya karar verdim (MSBuild dosyaları, en azından VS2005 ve VS2008 MSBuild proje dosyalarını kullanıyorlar). Diğer her şey için (özel yapılandırma, birim testi, paketleme, belge hazırlama ...) NAnt kullandım.

Sürekli entegrasyon için CruiseControl kullandım. Bu yüzden NAnt işlerini tetikleyen, kullanılan MSBuild'i oluşturmak için CC komut dosyalarımız vardı.

Son bir not: MSBuild Kurulum projelerini DESTEKLEMEZ! Yani DevEnv.com'u aramak veya doğrudan Visual Studio'yu kullanmakta sıkışıp kaldınız. Yaptığım şey bu oldu, ancak kurulum projesini varsayılan olarak tüm çözüm yapılandırmalarından devre dışı bıraktım, çünkü geliştiricilerin normalde bunları oluşturması gerekmeyecek ve eğer yaparlarsa bunları oluşturmak için manuel olarak seçebilirler.



1

NAnt için mevcut olan belgeler ve öğreticiler, NAnt ile komut dosyaları oluşturmayı öğrenmeyi kolaylaştırır. Bir kez NAnt asmak var ve yapı komut dosyaları oluşturma Ben bu bilgiyi MSBuild çevirmek başladı (Ben NAnt X yaptım, nasıl MSBuild X yapmak?). Microsoft'un belgeleri genellikle yararlı olmadan önce oldukça yüksek bir bilgi düzeyine sahiptir.

NAnt'den MSBuild'e geçmenin nedeni MSBuild'in daha güncel olmasıdır. Ne yazık ki NAnt'nin son sürümü 8 Aralık 2007'de, MSBuild 4.0 (.NET 4.0) ise çok uzakta değil. Görünüşe göre NAnt projesi öldü.

MSBuild kullanarak derleme komut dosyaları oluşturmayı öğrenmeye yeni başlayan biri için iyi belgeler bulursanız, NAnt'i atlayın ve doğrudan MSBuild'e gidin. NAnt yeni bir sürümle çıkarsa, NAnt ile yapmayı düşünürdüm, ama şimdi geride kalıyorlar.


1
Haziran 2012 itibariyle, NAnt'ın 0.92 sürümü web sitesinden edinilebilir: nant.sourceforge.net VE .Net 4.0'ı destekler.
Brett Rigby

0

İkisini de kullanıyoruz. NAnt, kopyalama, IIS üzerinde dağıtma, paketler oluşturma gibi tüm "komut dosyası" öğelerinden ve çözümü oluşturmaktan MSBuild sorumludur. Sonra NAnt'ın yeni bir sürümü tarafından desteklenmeyen .NET 4.0 ile ilgili sorunları önleyebiliriz.

NAnt ayrıca daha ölçeklenebilir. Dağıtım komut dosyalarını üretim sunucularına geçirmek istiyorsak, yalnızca derleme dosyasını kopyalayıp uygun bir .NET sürümü yüklüyoruz - csproj dosyalarıyla Visual Studio sorunu yok :)


0

YDeliver by Manoj, PSake'in üzerine inşa edilmiş bir yapı çerçevesidir. Zengin bir kütüphane fonksiyonu setine, iş akışlarını tanımlama yeteneğine sahiptir ve altıdan fazla kurumsal projeyi üretime sunmak için kullandık.

TeamCity , CruiseControl veya PowerShell çalıştırabilecek herhangi bir şeyle birlikte kullanın .


0

FlubuCore kullanıyoruz. Projeleri oluşturmak ve C # kodunu kullanarak dağıtım komut dosyalarını çalıştırmak için açık kaynaklı bir C # kütüphanesidir.

Flubu'nun nasıl kullanıldığına basit bir örnek:

protected override void ConfigureTargets(ITaskContext session)
{           

    var compile = session.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddTask(x => x.CompileSolutionTask())
        .DependsOn("generate.commonassinfo");
}

Flubu ve nasıl başlayacağınız hakkında daha fazla bilgiyi burada bulabilirsiniz: build-for-build-tool-msbuild-nant-or-something-else için seçim

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.