Выбор инструмента для сборки: MSBuild, NANT или что-то еще?
Я занимаюсь автоматизацией в моей компании. Мы семинар по C#. В настоящее время я работаю над автоматизированной сборкой. NANT - инструмент управления потоком. Хотя NANT активно не разрабатывается (последний бинарный файл выпущен в июне 2012 года, а репозиторий github не активен), MSBuild лучше. Поэтому я предпочитаю MSBuild, но уходящий в отставку NANT все еще под вопросом - какова стоимость?
У меня есть некоторые плюсы и минусы, но я знаю, что коллективный разум лучше. Спасибо за вашу помощь!
Обновление: я прочитал вопрос, но второй ответ вызывает у меня беспокойство. На сборочной машине есть несколько.NET Framework, это будет хлопотно?
MSBuild
Плюсы:
- Коммерческая поддержка
- Сообщество растет
- Интегрированный с VS и TFS
- Идите в ногу с.Net
Минусы:
- Переписать текущий скрипт
- Не знакомый людьми
NANT
Плюсы:
- Уже в использовании
- Знакомый людьми
Минусы:
- Долгое время не обновлялся (с 2012 года)
- Сообщество не активно
- Отсутствие новой поддержки.Net
3 ответа
Спасибо за все ответы. Мы решили использовать Cake, так как мы на семинаре по C#.
Мы написали FlubuCore (переписать Flubu). Это библиотека C# с открытым исходным кодом для построения проектов и выполнения сценариев развертывания с использованием кода C#.
Основными преимуществами гриппа, которые я вижу, являются:
- Поддержка.Net Core.
- Легко учиться и использовать, потому что вы пишете скрипт сборки полностью на C#.
- Свободный интерфейс и интеллект.
- Довольно много встроенных задач (компиляция, запуск тестов, управление iis, создание пакета deploy, публикация пакетов nuget, выполнение сценариев powershell...)
- Напишите свой собственный код C# в сценарии и выполните его..
- Запустите любую внешнюю программу или команду в сценарии с помощью RunProgramTask.
- Ссылка на любую библиотеку.net или файл исходного кода C# в buildscript. Теперь также доступна опция ссылки на пакет nuget в скрипте сборки.
- Пишите тесты, отлаживайте ваш скрипт сборки.
- Используйте задачи flubu в любом другом приложении.net.
- Веб-API доступен для флубу. Полезно для удаленного автоматического развертывания.
- Напишите свои собственные задачи Flubu и расширьте интерфейс Flubu с ними.
Вы можете найти грипп на nuget:
Ищите FlubuCore.Runner, если вам это нужно для проекта.net
Ищите dotnet-flubu, если вам это нужно для основного проекта.net
Пример использования flubu в.net:
protected override void ConfigureBuildProperties(IBuildPropertiesContext context) {
context.Properties.Set(BuildProps.NUnitConsolePath,
@ "packages\NUnit.ConsoleRunner.3.6.0\tools\nunit3-console.exe");
context.Properties.Set(BuildProps.ProductId, "FlubuExample");
context.Properties.Set(BuildProps.ProductName, "FlubuExample");
context.Properties.Set(BuildProps.SolutionFileName, "FlubuExample.sln");
context.Properties.Set(BuildProps.BuildConfiguration, "Release");
}
protected override void ConfigureTargets(ITaskContext session) {
var loadSolution = session.CreateTarget("load.solution")
.SetAsHidden()
.AddTask(x => x.LoadSolutionTask());
var updateVersion = session.CreateTarget("update.version")
.DependsOn(loadSolution)
.SetAsHidden()
.Do(TargetFetchBuildVersion);
session.CreateTarget("generate.commonassinfo")
.SetDescription("Generates common assembly info")
.DependsOn(updateVersion)
.TaskExtensions().GenerateCommonAssemblyInfo()
var compile = session.CreateTarget("compile")
.SetDescription("Compiles the solution.")
.AddTask(x => x.CompileSolutionTask())
.DependsOn("generate.commonassinfo");
var unitTest = session.CreateTarget("unit.tests")
.SetDescription("Runs unit tests")
.DependsOn(loadSolution)
.AddTask(x => x.NUnitTaskForNunitV3("FlubuExample.Tests"));
session.CreateTarget("abc").AddTask(x => x.RunProgramTask(@ "packages\LibZ.Tool\1.2.0\tools\libz.exe"));
session.CreateTarget("Rebuild")
.SetDescription("Rebuilds the solution.")
.SetAsDefault()
.DependsOn(compile, unitTest);
}
//// Some custom code
public static void TargetFetchBuildVersion(ITaskContext context) {
var version = context.Tasks().FetchBuildVersionFromFileTask().Execute(context);
int svnRevisionNumber = 0; //in real scenario you would fetch revision number from subversion.
int buildNumber = 0; // in real scenario you would fetch build version from build server.
version = new Version(version.Major, version.Minor, buildNumber, svnRevisionNumber);
context.Properties.Set(BuildProps.BuildVersion, version);
}
Пример использования flubu в ядре.net
public class MyBuildScript : DefaultBuildScript
{
protected override void ConfigureBuildProperties(IBuildPropertiesContext context)
{
context.Properties.Set(BuildProps.CompanyName, "Flubu");
context.Properties.Set(BuildProps.CompanyCopyright, "Copyright (C) 2010-2016 Flubu");
context.Properties.Set(BuildProps.ProductId, "FlubuExample");
context.Properties.Set(BuildProps.ProductName, "FlubuExample");
context.Properties.Set(BuildProps.SolutionFileName, "FlubuExample.sln");
context.Properties.Set(BuildProps.BuildConfiguration, "Release");
}
protected override void ConfigureTargets(ITaskContext context)
{
var buildVersion = context.CreateTarget("buildVersion")
.SetAsHidden()
.SetDescription("Fetches flubu version from FlubuExample.ProjectVersion.txt file.")
.AddTask(x => x.FetchBuildVersionFromFileTask());
var compile = context
.CreateTarget("compile")
.SetDescription("Compiles the VS solution and sets version to FlubuExample.csproj")
.AddCoreTask(x => x.UpdateNetCoreVersionTask("FlubuExample/FlubuExample.csproj"))
.AddCoreTask(x => x.Restore())
.AddCoreTask(x => x.Build())
.DependsOn(buildVersion);
var package = context
.CreateTarget("Package")
.CoreTaskExtensions()
.DotnetPublish("FlubuExample")
.CreateZipPackageFromProjects("FlubuExample", "netstandard2.0", "FlubuExample")
.BackToTarget();
//// Can be used instead of CreateZipPackageFromProject. See MVC_NET4.61 project for full example of PackageTask
//// context.CreateTarget("Package2").AddTask(x =>
x.PackageTask("FlubuExample"));
var test = context.CreateTarget("test")
.AddCoreTaskAsync(x => x.Test().Project("FlubuExample.Tests"))
.AddCoreTaskAsync(x => x.Test().Project("FlubuExample.Tests2"));
context.CreateTarget("Rebuild")
.SetAsDefault()
.DependsOn(compile, test, package);
}
}
Подробную презентацию и документацию можно найти здесь: https://github.com/flubu-core/flubu.core
Вы можете найти полные примеры здесь: https://github.com/flubu-core/examples
Есть собственность nant.settings.currentframework
который используется для установки целевой платформы в случае, если у вас есть несколько.net Framework
<property name="nant.settings.currentframework" value="net-2.0" />
- nant.settings.currentframework Текущая целевая структура, например. "Сеть-1,0".
- nant.settings.currentframework.description Устаревшее. Описание текущей целевой структуры.
- nant.settings.currentframework.frameworkdirectory Устаревший. Каталог фреймворка текущей целевой фреймворк.
- nant.settings.currentframework.sdkdirectory Устаревший. Каталог SDK фреймворка текущей целевой фреймворк.
- nant.settings.currentframework.frameworkassemblydirectory Устаревший. Каталог сборки фрейма текущей целевой фреймворка.
- nant.settings.currentframework.runtimeengine Устаревший. Среда выполнения текущей целевой структуры, если используется, например. mono.exe.