NAnt или MSBuild, какой выбрать и когда?

160

Я знаю, что есть другие вопросы, связанные с NAnt и MSBuild, относительно переполнения стека, но я не смог найти прямого сравнения между ними, и вот вопрос.

Когда следует выбирать 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 .
  • Пожалуйста, смотрите комментарии ниже для полного и актуального обсуждения субъективных различий.
Огрский псалом33
источник
Вы можете редактировать файл .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 именно по этой причине.
DarinH
77

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

Просто для протокола, в прошлом я использовал NMake, Make, Ant, Rake, NAnt и MSBuild для нетривиальных сборок (в таком порядке). Мой любимый MSBuild, руки вниз (и я не одобряю его, потому что «это то, что Visual Studio использует»). ИМХО, это очень недооцененный инструмент для сборки.

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

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

Милан Гардиан
источник
11
Вот Это Да! Не знал, что MSBuild поставляется вместе со средой выполнения. Это довольно круто, и я определенно вижу преимущества там. Однако я не понимаю сравнение между функциональным / процедурным. Было бы интересно услышать, что делает MSBuild намного более мощным, как только он его получает.
Скотт Саад
2
Msbuild на самом деле имеет ряд зависимостей от файлов из различных SDK, которые становятся очевидными только при вызове определенных целей. Таким образом, хотя msbuild доступен из коробки, он может не работать.
Сэм Шилс
6
Следует добавить одну вещь: не только возможно вызывать сборки .NET из msbuild, что дает один доступ ко многим очень удобным функциям (например, все в Systme.IO.Path может пригодиться в сценариях сборки). Также можно написать простой код C # в файлах msbuild и выполнить его. Что просто потрясающе. msdn.microsoft.com/en-us/library/dd722601.aspx И если что-то слишком усложняется, написание пользовательских задач тоже очень просто.
Стиджн
1
Из Википедии: « MSBuild ранее был в комплекте с .NET Framework; начиная с Visual Studio 2013, однако вместо этого он связан с Visual Studio».
DavidRR
MSBuild (Microsoft Build Tools 2013) также можно загрузить независимо от Visual Studio 2013 здесь .
DavidRR
45

Лично я использую оба - для одного проекта.

MSBuild отлично подходит для создания решений и проектов Visual Studio - для этого он и создан.

На мой взгляд, NAnt легче редактировать вручную, особенно если вы уже знаете Ant. NAnt может очень легко вызвать MSBuild с помощью NAntContrib. Итак, я вручную создаю скрипт NAnt для выполнения таких задач, как копирование встроенных файлов, очистка и т. Д., И вызываю MSBuild, чтобы выполнить фактическую часть «превращение моего исходного кода C # в сборки».

Если вам нужен пример этого, посмотрите на мой файл сборки Protocol Buffers . (Я бы не стал утверждать, что это невероятный сценарий NAnt, но он справляется со своей работой.)

Джон Скит
источник
1
И это поддерживает Mono. Поддержка MSBuild от Mono дерьмовая.
Мехрдад Афшари
@Mehrdad: Да, в какой-то момент я действительно должен попытаться заставить протоколные буферы скомпилировать на Mono ... в настоящее время есть ошибка gmcs, которая останавливает ее работу :( Идея всегда заключалась в том, что в конечном итоге она будет работать на Mono.
Джон Скит
1
Ребята, моно использует XBuild и легко портировать MSBuild на XBuild. Проверьте это: mono-project.com/Porting_MSBuild_Projects_To_XBuild .
Фьясар
20

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

MSBuild требуется время, чтобы понять, но как только вы это сделаете, это очень приятно.

Учебные материалы:

Константин Таркус
источник
38
Эй, я слышал об этих книгах :)
сказал Ибрагим Хашими
19

KISS = использовать MSBuild.

Зачем добавлять что-то еще в микс, если у вас есть что-то, что будет делать разумную работу из коробки? Когда MSBuild прибыл, NAnt умер. И у Mono будет реализация MSBuild ( xbuild ).

СУХОЙ = использовать MSBuild.

Спросите себя, что вы хотите от системы сборки? Мне нужна система сборки, которая также используется моей IDE, а не поддерживает две разные конфигурации.

Лично я хотел бы услышать некоторые реальные аргументы для NAnt, потому что я просто не могу думать ни о каких, которые действительно держат воду.

Белка
источник
2
«Когда msbuild arived, nant умер» - я думаю, что это решающий фактор, даже без VS (который я не использую).
Harpo
Я согласен. В DotNet 1.1 не было msbuild.exe. Таким образом, мы были ввернуты тогда. Начиная с 2.0, msbuild.exe и дополнительные библиотеки делают много. И написание пользовательских MsBuild-Task имеет кривую обучения, но я написал около 10 из них за эти годы.
granadaCoder
1
Я должен согласиться, вы должны использовать тот же инструмент для сборки, что и сервер сборки, что позволит вам быстрее провалиться.
честь Крыма
14

Одна вещь, которую я заметил в нескольких постерах, была о том, что пришлось вручную редактировать файлы .csproj (или .vbproj и т. Д.).

MSBuild позволяет настраивать эти файлы. * Proj с помощью файлов .user. Если у меня есть проект с именем MyCreativelyNamedProject.csproj и я хочу настроить внутри него задачи MSBuild, я могу создать файл с именем MyCreativelyNamedProject.csproj.user и использовать CustomBeforeMicrosoftCommonTargets и CustomAfterMicrosoftCommonTargets для настройки этих файлов.

Кроме того, как NAnt, так и MSBuild могут быть настроены на содержание с помощью пользовательских задач MSBuild и расширений NantContrib.

Итак, использование NAnt или MSBuild действительно сводится к знакомству:

  • Если вы уже знакомы с Ant, используйте NAnt. Кривая обучения будет очень простой.
  • Если вы не знакомы ни с одним из этих инструментов, MSBuild уже интегрирован с Visual Studio и не требует дополнительных инструментов.

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

CleverPatrick
источник
1
+1 за указание на разницу между выпусками .net и nant. Я помню, когда вышел .net 3.5 и мне пришлось использовать взломанный nant.exe.config из сети, чтобы все заработало. Не смешно.
mmacaulay
9
В соответствии с большим количеством сообщений здесь, эти файлы .USER содержат + специфическую для пользователя информацию +, которую не следует регистрировать, так что это было бы последним местом, где я хотел бы поместить настройки сборки ... Любые настройки сборки по определению не должны не зависит от пользователя, и поэтому не следует заходить в эти файлы .user ...
DarinH
1
Согласен с дрвентуром; .user-файлы, как следует из названия, предназначены для пользователя, и их даже не следует регистрировать в вашем репозитории исходного кода. Это НЕ место для автоматизации сборки.
Къетил Клауссен
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, если это ваша задача. Nant кажется более гибким и более подходящим, если вы предпочитаете писать сценарии вручную, и если вы приехали из мира Java, вы, вероятно, будете чувствовать себя как дома.

mmacaulay
источник
Хорошая точка зрения. Оба решения могут быть легко расширены и настроены любым желаемым способом.
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 был 8 декабря 2007 года, в то время как MSBuild 4.0 (.NET 4.0) не за горами. Похоже, проект NAnt умер.

Если вы найдете хорошую документацию для того, кто только начинает изучать создание сценариев сборки с использованием MSBuild, пропустите NAnt и перейдите прямо к MSBuild. Если NAnt когда-нибудь выпустит новый релиз, то я бы решил остаться с NAnt, но сейчас они отстают.

mcdon
источник
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 от Manoj - это фреймворк для сборки, построенный на основе PSake. Он имеет богатый набор библиотечных функций, возможность определять рабочие процессы, и мы использовали его для доставки более шести корпоративных проектов в производство.

Используйте его вместе с TeamCity , CruiseControl или любым другим , что может запускать PowerShell .

Zasz
источник
0

Мы используем FlubuCore. Это библиотека C # с открытым исходным кодом для построения проектов и выполнения сценариев развертывания с использованием кода C #.

Простой пример того, как используется flubu:

protected override void ConfigureTargets(ITaskContext session)
{           

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

Вы можете найти больше информации о flubu и о том, как начать работу здесь: choice-for-build-tool-msbuild-nant-или-что-то еще

Stan88
источник