NAnt або MSBuild, який вибрати і коли?


160

Я знаю, що є інші питання, пов'язані з NAnt та MSBuild щодо Stacka Overflow, але я не зміг знайти прямого порівняння між цими двома, тому ось питання.

Коли слід вибрати NAnt над MSBuild? Який краще для чого? Чи більше NAnt підходить для домашніх / відкритих проектів та MSBuild для робочих проектів? Який досвід роботи з будь-яким із цих двох?

Відповіді:


97

Я провів подібне розслідування цього тижня. Ось що я зміг визначити:

NAnt:

  • Крос-платформа (підтримує Linux / Mono). Це може бути зручно, наприклад, встановити веб-сайт для декількох цілей (тобто Linux Apache та Windows IIS).
  • На 95% схожий у синтаксисі з Ant (легко для поточних користувачів Ant або підключення Java)
  • Інтеграція з NUnit для запуску одиничних тестів як частини збірки та з NDoc для документації на виробництво.

MSBuild:

  • Вбудований .NET.
  • Інтеграція з Visual Studio
  • Початок роботи з MSBuild у Visual Studio - це все за кадром. Якщо ви хочете поглибитись, ви можете вручну редагувати файли.

Суб'єктивні відмінності: (YMMV)

  • Документація NAnt трохи простіша. Наприклад, довідник завдань MSBuild перелічує "Завдання Csc - описує завдання Csc та його параметри." (Спасибі за "допомогу"?) Та посилання на завдання NAnt "csc - компілює програми C #." ОНОВЛЕННЯ: Я помітив, що документація MSBuild була вдосконалена і зараз значно краща (можливо, нарівні з NAnt).
  • Непросто зрозуміти, як редагувати джерело сценарію збірки (*. * Файл proj) безпосередньо з Visual Studio. З NAnt у мене просто Visual Studio трактує сценарій .build як файл XML.
  • Мабуть, у Visual Studio Проекти веб-прикладних програм не отримують файл *. * Proj за замовчуванням, тому у мене виникли великі труднощі з'ясувати, як навіть змусити MSBuild працювати на моїй, щоб створити сценарій розгортання.
  • NAnt не вбудований у Visual Studio і його потрібно додавати або за допомогою надбудови, або як "зовнішній інструмент". Це трішки болісно налаштовувати.
  • (Редагувати :) Один із моїх колег придумав це - якщо ви хочете налаштувати машину складання за допомогою CruiseControl для постійної інтеграції, CruiseControl інтегрується з NAnt непомітно. ОНОВЛЕННЯ: CruiseControl також має завдання MSBuild .
  • Будь ласка, дивіться коментарі нижче для повного та актуального обговорення суб'єктивних відмінностей.

ви можете редагувати файл .proj , але після того, як ви вивантажити проект (там повинна бути опція «вивантажити» в контекстному меню для проекту)
Йордан Павлов

18
@Yordan: або просто помістіть свої налаштування в окремий .build файл (чи будь-який інший) та імпортуйте + виконайте його з вашого .csproj-файлу. Тоді вам потрібно лише один раз відредагувати .csproj, і ви можете додати .build файл до свого рішення. Двічі клацніть і ви редагуєте, як і будь-який інший файл. Можна зіставити .build файли в редактор XML у своїх параметрах.
Кент Бугаарт

9
Існує завдання MSBuild CCNet - Деталі можна знайти на веб-сайті: confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Гавін Міллер

2
Варто зазначити, що вам не потрібно змінювати самі файли .csproj. Ви можете використовувати файл MyProject.csproj.user, щоб зробити ці зміни, залишивши ваш .csproj файл чистим і незайманим. MSBuild знає шукати ці файли .user і автоматично імпортує їх у процес збирання. Дивіться: ahmed0192.blogspot.com/2006/11/…
CleverPatrick

3
@CleverHuman, чи не так, що .user файл зазвичай містить модні проекти, які ви зазвичай не перевіряєте разом із рештою проекту? Я використовую пропозицію Кента протягом багатьох років, і це дуже добре працює. Ви модифікуєте файл PROJ один раз, щоб включити другий файл PROJ, а потім додайте другий файл PROJ до свого проекту. З цього моменту ви можете легко налаштувати цей другий файл PROJ, не проходячи цей процес вивантаження / перезавантаження. Я схиляюся до MSBuild саме з цієї причини.
ДаринH

77

Одне з головних розіграшів MSBuild для мене (на платформах Windows) - це те, що він є частиною самого .NET. Це означає, що будь-яка машина Windows, яка оновлюється оновленням Windows, матиме MSBuild. Додайте до цього той факт, що компілятор C # також є частиною самого .NET і у вас є платформа, яка може будувати проекти на чистих машинах. Не потрібно встановлювати бегемот Visual Studio. NAnt, з іншого боку, повинен бути явно встановлений до того, як може бути запущена збірка.

Тільки для запису я раніше використовував NMake, Make, Ant, Rake, NAnt та MSBuild для нетривіальних побудов (у такому порядку). Моя улюблена - MSBuild, руки вниз (і я не віддаю перевагу тому, що "саме цим користується Visual Studio"). IMHO, це дуже недооцінений інструмент побудови.

Я б порівняв NAnt проти MSBuild до різниці між процедурним та функціональним програмуванням. NAnt досить простий, і ви отримуєте-що-що-ви бачите. MSBuild, з іншого боку, вимагає трохи більше роздумів. Крива навчання крутіша. Але як тільки ви «отримаєте це», ви зможете зробити з ним деякі дивовижні речі.

Тому я рекомендую подивитися на MSBuild, якщо ви також орієнтуєтесь на функціональне або логічне програмування стилів - якщо ви готові вкласти трохи часу та зусиль, перш ніж побачити відчутні результати (звичайно, я також твердо вірю, що інвестиція в підсумку окупиться, і ви може робити більш потужні речі ефективніше).


11
Оце Так! Не знав, що MSBuild приїжджає поставлений із часом виконання. Це досить круто, і я точно можу побачити переваги. Однак я не розумію порівняння між функціональним / процедурним. Було б цікаво почути, що робить MSBuild настільки потужнішим, як тільки він «отримує його».
Скотт Саад

2
Msbuild насправді має ряд залежностей від файлів різних sdks, які стають очевидними лише під час виклику певних цілей. Отже, хоча msbuild доступний поза коробкою, він може не працювати.
Сем Шилес

6
ще одне, що слід додати: не тільки це можливо входити в .NET збірки зсередини msbuild, що дає один доступ до цілого ряду дуже зручних функцій (наприклад, до всього в Systme.IO.Path може стати в нагоді в сценаріях побудови) , також можна записати звичайний код C # у файли msbuild та виконати його. Що просто приголомшливо. msdn.microsoft.com/en-us/library/dd722601.aspx І якщо все стає занадто складним, написання спеціальних завдань також є легким вітром.
стихій

1
З Вікіпедії: " Раніше MSBuild входив у комплект.
DavidRR

MSBuild (Microsoft Build Tools 2013) також можна завантажити незалежно від Visual Studio 2013 тут .
DavidRR

45

Особисто я використовую обоє - для одного проекту.

MSBuild чудово створює рішення та проекти Visual Studio - саме для цього він створений.

NAnt легше редагувати вручну, на мою думку - особливо якщо ви вже знаєте Мураш. NAnt може викликати MSBuild дуже легко за допомогою NAntContrib. Отже, я розробив сценарій NAnt, щоб виконувати такі речі, як копіювання вбудованих файлів, очищення тощо - і закликаю MSBuild зробити фактичну частину "перетворити мій вихідний код C # на збірки".

Якщо ви хочете прикладу цього, подивіться мій файл збірки буферів протоколів . (Я б не стверджував, що це казковий сценарій NAnt, але він робить свою роботу.)


1
І це дійсно підтримує Mono. Підтримка MSBuild Mono - хитра.
Мехрдад Афшарі

@Mehrdad: Так, у якийсь момент я дійсно повинен спробувати змусити протоколи буферів протоколу збирати на Mono ... на даний момент є помилка gmcs, яка не дозволяє йому працювати :( Ідея завжди була в тому, що вона врешті-решт буде працювати над Mono.
Джон Скіт

1
Хлопці, моно використовує XBuild, і MSBuild легко перенести на XBuild. Перевірте це: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
fyasar

20

NAnt має більше функцій, але MSBuild має набагато кращу фундаментальну структуру (елемент метаданих порід), що робить його набагато простіше будувати багаторазові сценарії MSBuild.

MSBuild потребує певного часу, щоб зрозуміти, але колись ти це робиш, це дуже приємно.

Навчальні матеріали:


38
Гей, я чув про ці книги :)
Саєд Ібрагім Хашімі

19

KISS = Використовуйте MSBuild.

Навіщо додавати щось інше в суміш, коли у вас є щось, що зробить розумну роботу поза коробкою? Коли прибув MSBuild, НАнт помер. І Mono матиме реалізацію MSBuild, ( xbuild ).

DRY = Використовуйте MSBuild.

Запитайте себе, що ви хочете отримати від системи складання? Я хочу створити систему побудови, яку також використовує моя IDE, а не підтримка двох різних конфігурацій.

Особисто я хотів би почути деякі реальні аргументи щодо NAnt, тому що я просто не можу придумати жодного, який насправді затримує воду.


2
"Коли msbuild прилетів, нант помер" - Я думаю, це клінік, навіть без VS (яким я не користуюся).
harpo

Я згоден. У DotNet 1.1 не було msbuild.exe. Отож, ми тоді були накручені. Починаючи з 2.0, msbuild.exe та додаткові бібліотеки роблять багато. І написання користувальницької програми MsBuild-Task має криву навчання, але я написав про них 10 років.
granadaCoder

1
Я повинен погодитися, ви повинні використовувати той самий інструмент для створення як розробник, як і сервер збирання, що дозволяє швидше виходити з ладу.
krystan honor

14

Одне, що я помітив у кількох афішах, - це редагування файлів .csproj (або .vbproj тощо).

MSBuild дозволяє налаштувати ці файли. * Proj за допомогою файлів .user. Якщо у мене є проект під назвою MyCreativelyNamedProject.csproj і хочете налаштувати завдання MSBuild всередині нього, я можу створити файл під назвою MyCreativelyNamedProject.csproj.user і використовувати CustomBeforeMicrosoftCommonTargets та CustomAfterMicrosoftCommonTargets для налаштування цих файлів.

Крім того, і NAnt, і MSBuild можна налаштувати під вміст серця за допомогою спеціальних завдань MSBuild та через розширення NantContrib.

Отже, використання NAnt або MSBuild дійсно зводиться до знайомства:

  • Якщо ви вже знайомі з мурахами, використовуйте NAnt. Крива навчання буде дуже простою.
  • Якщо ви не знайомі з жодним із інструментів, MSBuild вже інтегрований у Visual Studio і не потребує додаткових інструментів.

Варто також додати, що MSBuild майже гарантовано працює з усіма новими версіями .NET та Visual Studio, як тільки вони будуть випущені, тоді як NAnt може мати деякий відставання.


1
+1 для вказівки відставання між .net-версіями та nant-релізами. Я пам’ятаю, коли .net 3.5 вийшов і мав використовувати зламаний nant.exe.config з мереж, щоб працювати. Не смішно.
mmacaulay

9
Згідно з багатьма публікаціями тут, ці файли .USER містять + конкретну інформацію про користувача +, яка не повинна бути зареєстрована, тому це було б останнє місце, де я хотів би встановити налаштування збірки ... Будь-які налаштування побудови за визначенням не повинні Я не буду специфічним для користувача, і тому не слід входити в ці файли .user ...
DarinH

1
Погодьтеся з drventure; .user-файли є такими, як підказує ім'я користувача pr, і вони навіть не повинні бути зареєстровані у вашому сховищі керування джерелами. Це НЕ місце для автоматизації збірки.
Kjetil Klaussen

10

Я використовую обидва в тому, що мої сценарії NAnt називають MSBuild. Моя основна причина перебування з NAnt - ізоляція . Дозвольте мені пояснити, чому я вважаю це важливим:

  1. Додавання залежностей до вашого проекту. Файл збірки NAnt чужий для Visual Studio (в моєму випадку я вважаю це професіоналом), тому Visual Studio не намагається нічого з цим робити. Завдання MSBuild вбудовані як частина рішення і можуть посилатися на інші завдання MSBuild. Я отримав вихідний код від когось іншого, щоб дізнатися, що я не міг створити, оскільки завдання спільноти MSBuild не були встановлені. Що мене особливо засмучує, це те, що Visual Studio просто не збирався і викинув купу помилок, які змусили втратити час налагодження. Це, незважаючи на те, що запитувана збірка могла піти вперед (як, наприклад, збірка налагодження) без деяких додаткових завдань MSBuild. Якщо коротко: мені не подобається додавати залежності до мого проекту, якщо я можу його уникнути .

  2. Я не довіряю Visual Studio, наскільки я міг би кинути її розробників. Це пов’язано з першими днями роботи Visual Studio, коли це могло б розправити мій HTML. Наприклад, я досі не використовую дизайнера (на нещодавній конференції я виявив, що колеги зробили те саме). Я виявив, що Visual Studio може викрутити залежності та номери версій у файлі DLL (я не можу це повторити, але це сталося в проекті послідовно і спричинило багато горя та втраченого часу). Я вдався до процедури збирання, яка використовує Visual Studio для побудови лише в режимі налагодження. Для виробництва я використовую NAnt, щоб контролювати все зовні . Visual Studio просто не може більше перешкоджати, якщо я будую за допомогою NAnt.

PS: Я веб-розробник і не займаюся розробкою Windows Forms.


6

Хоча я не дуже знайомий з MsBuild, я маю враження, що деякі ключові відмінності з обох сторін можуть бути доповнені доповненнями:

Нещодавно мені довелося будувати проект Silverlight у Нанті. Я виявив, що життя буде простішим, якби я щойно зробив це з MsBuild - я в кінцевому підсумку викликав завдання MsBuild із сценарію Nant, тому, гадаю, це не надто звичайне, щоб поєднувати та поєднувати два.

Крім того, я думаю, це буде питання особистих уподобань - очевидно, ви можете керувати деякими / більшістю функціональності MsBuild з Visual Studio, якщо це ваша справа. Нант здається більш гнучким і краще підходить, якщо ви віддаєте перевагу писати сценарії вручну, а якщо ви приїжджаєте зі світу Java, ви, швидше за все, будете з ним вдома.


Гарна думка. Обидва рішення можна легко розширити і налаштувати будь-яким бажаним способом.
CleverPatrick

2

Я закінчив використовувати обоє. Під час перепроектування нашої системи побудови я зіткнувся з складною проблемою. А саме, я не міг позбутися .vcproj (та сім'ї), тому що всі ми використовували VS для оновлення файлів проекту, налаштувань та конфігурацій. Тож без величезного дублювання та схильності до помилок ми не змогли базувати нашу систему побудови на новому наборі файлів.

З цієї причини я вирішив зберегти "proj" файли VS та використовувати MSBuild (це файли MSBuild, принаймні VS2005 та VS2008 використовують файли проекту MSBuild). Для всього іншого (спеціальна конфігурація, тестування одиниць, упаковка, підготовка документації ...) я використовував NAnt.

Для постійної інтеграції я використовував CruiseControl. Отже, у нас були сценарії CC, які запускали завдання NAnt, які для побудови використовували MSBuild.

Останнє зауваження: MSBuild НЕ підтримує програми налаштування! Таким чином, ви застрягли в тому, щоб зателефонувати на DevEnv.com або скористатися Visual Studio безпосередньо. Так я і закінчився, але я встановив проект налаштування за замовчуванням від усіх конфігурацій рішення, оскільки розробникам зазвичай не потрібно їх будувати, і якщо вони будуть, вони можуть вручну вибрати для їх створення.


1

Нещодавно я перейшов з NAnt на MSBuild через його здатність будувати VS-рішення. Я все ще використовую NAnt зрідка, хоча.

Ви також можете перевірити MSBuild Завдання спільноти, які схожі на NAntContrib.


Деякі версії VS-рішень підтримуються NAnt. nant.sourceforge.net/release/0.85/help/tasks/solution.html
Деніз

1

Документація та підручники, доступні для NAnt, полегшують навчання навчанню створення сценаріїв з NAnt. Як тільки я отримав вивірку NAnt і створив сценарії збірки, я почав перекладати ці знання в MSBuild (я зробив X в NAnt, як мені зробити X в MSBuild?). Документація Microsoft зазвичай передбачає досить високий рівень знань, перш ніж вона стане корисною.

Причина переходу з NAnt на MSBuild полягає в тому, що MSBuild є більш поточним. На жаль, останній реліз NAnt був у грудні 2007 року, тоді як MSBuild 4.0 (.NET 4.0) не за горами. Схоже, проект NAnt загинув.

Якщо ви знайдете гарну документацію для того, хто тільки починає вчитися створювати сценарії збірки за допомогою MSBuild, тоді пропустіть NAnt і перейдіть прямо до MSBuild. Якщо NAnt коли-небудь вийде з новим випуском, то я б подумав дотримуватися NAnt, але вони зараз відстають.


1
З червня 2012 року версія 0.92 NAnt доступна на веб-сайті: nant.sourceforge.net І підтримує .Net 4.0.
Бретт Рігбі

0

Ми використовуємо і те, і інше. NAnt несе відповідальність за всі "сценарії", такі як копіювання, розміщення на IIS , створення пакетів, а MSBuild відповідає за створення рішення. Тоді ми можемо уникнути проблем із непідтримуваною .NET 4.0 новою версією NAnt.

NAnt також більш масштабований. Якщо ми хочемо перенести сценарії розгортання на виробничі сервери, ми лише скопіюємо файл збірки та встановимо належну версію .NET - проблем з Visual Studio немає з файлами csproj :)


0

YDeliver by Manoj - це структура побудови, побудована на версії PSake. Він має багатий набір бібліотечних функцій, здатність визначати робочі процеси, і ми використовували його для доставки більше шести підприємств для виробництва.

Використовуйте його спільно з TeamCity , CruiseControl або будь-чим, що може запускати PowerShell .


0

Ми використовуємо FlubuCore. Це бібліотека C # з відкритим кодом для створення проектів та виконання сценаріїв розгортання за допомогою коду C #.

Простий приклад використання флюбу:

protected override void ConfigureTargets(ITaskContext session)
{           

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

Ви можете знайти більше інформації про flubu та про те, як розпочати роботу тут: вибір-для-побудови-інструмента-msbuild-nant-або-щось ще

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.