Когда речь заходит о сборке .Net проектов, первое, что приходит в голову, это утилита MSBuild + сопутствующие build-скрипты. Действительно, пока проект небольшой, ее возможностей вполне хватает. Но со временем количество кода растет, структура продукта становится все более сложной и запутанной, и начинаешь задумываться о поиске более гибкого решения.
В нашем случае, таким решением оказалась связка Rake+Albacore. Что же это такое? Rake — инструмент для автоматизации сборки програмного кода, написанный на Ruby. Про Rake на хабре уже была довольно детальная статья пользователя Lass_ua (за которую, кстати, ему большое человеческое спасибо), поэтому повторяться не буду. Скажу только, что мы выбрали его за исключительную гибкость, которую не могли получить от MSBuild скриптов. Она обусловлена тем, что весь процесс сборки описывается, по сути, программой на Ruby, что открывает перед нами море возможностей.
А вот про Albacore я, к своему удивлению, не нашел ни одной статьи, хотя это уже достаточно зрелый и известный проект
Что же такое Albacore?
По сути, Albacore — это всего лишь набор кастомных задач для Rake, ориентированных на сборку .Net проектов. Вот их полный список:
- ASP.NET Compiler
- Assembly Info Generator
- CSC – The C-Sharp Compiler
- Exec – Execute any arbitrary command line
- Fluent Migrator
- MSBuild
- MSpec
- MSTest
- Nant
- NChurn
- NCover Console
- NCover Reports
- NDepend
- NugetPack – Create .nuget packages from a .nuspec file
- NugetPush – Push .nuget packages online.
- NugetPublish – Publishes the .nuget packages online.
- Nunit
- Nuspec – Generate a .nuspec file for creating a .nuget package
- Output – Common build output tasks, including file copying and template expansion
- Plink
- SQLCmdTask
- UnZip
- XUnit
- Zip
Установка и использование
Установка Rake и Albacore:
gem install rake
gem install albacore
Чтобы использовать Albacore, достаточно подключить соответствующий модуль в вашем rakefile
require 'albacore'
Теперь мы можем, помимо задач Rake, использовать также задачи Albacore. В нашем случае, две наиболее используемые из них это MSBuild(собственно, вызов MSBuild.exe с заданными параметрами) и Exec(Выполнение произвольной команды в командной среде Windows)
Вызываем MSBuild:
msbuild :build_solution do |msb|
msb.properties = { :configuration => :Debug }
msb.targets = [ :Clean, :Build ]
msb.solution = "path/to/your/solution.sln"
end
Единственное обязательное поле тут — solution. Детальную инструкцию по применению этой задачи можно найти здесь
Для Exec нужно определить всего два поля — собственно команда и ее параметры
exec do |cmd|
cmd.command = "LIB\sgen\sgen.exe"
cmd.parameters = "BIN\mylovely.dll /force"
end
К сожалению, перечень задач Albacore все таки не покрывает всех потребностей, которые могут возникнуть при сборке .Net проекта. В нашем проекте для тестирования используется Gallio, которого в этом перечне нет. Но, как оказалось, Ruby сообщество позаботилось о таких, как мы, и первая же ссылка по запросу «gallio rake» привела меня на github:gist с кодом соответствующей задачи.
Впечатления
Переход к связке Rake+Albacore у нас получился очень быстрым и безболезненным, и мы получили необходимую нам гибкость в сборке проекта. Ruby для меня новый язык, и я приятно удивлен количеством информации и разнообразных полезных кусков кода, которое присутствует на просторах Интернета, а также удобством и возможностями самого языка. Думаю, на этом мое знакомство с ним не ограничится, я планирую дальше использовать его в нашем проекте для небольших сопутствующих утилит.
Автор: lavice