Статьи

Albacore: создание приложений .NET с помощью Rake

Если вы являетесь разработчиком .NET и хотите перейти на Ruby, один из способов начать использовать Ruby прямо сейчас — это Albacore. В этой статье мы рассмотрим, как вы можете взять существующий проект веб-приложения ASP.NET, добавить Rakefile и построить проект с использованием Albacore.

Что такое Альбакор?

Albacore — это набор расширений для Rake, специально предназначенных для создания проектов на основе .NET. У него есть задачи по созданию, перестройке и очистке проектов, запуску модульных тестов nunit, xunit или mstest, копированию файлов и расширению шаблонов, а также генерации информации о сборке.

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

Фон

Однако сначала немного предыстории, если вы не знакомы с Rake (если вы действительно знаете, что такое Rake, не стесняйтесь пропустить этот раздел). Rake — это Ruby Make, программа для сборки Ruby, похожая на Make. Он вращается вокруг задач, которые живут в Rakefile.

Простой пример Rakefile выглядит примерно так:

task :default => [:foo, :bar]
task :foo do
puts «foo»
end
task :bar do
puts «bar»
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Здесь у нас есть 3 задачи: foo , bar и default . default имеет две зависимости: задачи foo и bar . Чтобы запустить Rake, вы rake в командной строке. Затем он ищет файл Rake в текущем каталоге и по умолчанию запускает задачу по умолчанию. Чтобы запустить другую задачу, вы должны передать имя задачи в качестве аргумента Rake, например, rake foo . Используя приведенный выше пример Rakefile, вы можете увидеть, как выходные данные отличаются:

$> rake
foo
bar
$> rake foo
foo
$> rake bar
bar

view raw
gistfile1.sh
hosted with ❤ by GitHub

Установка Альбакора

Поскольку Albacore требует Rake (и, следовательно, Ruby), вам необходимо убедиться, что Rake установлен первым. Возможно, у вас есть, но если вы этого не сделаете, установить его достаточно просто:

 gem install rake 

С установленным Rake остается только установить Albacore:

 gem install albacore 

После того, как вы установили Albacore, единственное условие заключается в том, что вы обязательно добавляете require 'albacore' albacore require 'albacore' в свой файл Rakefile, иначе у вас не будет доступа к задачам Albacore Rake.

Преобразование существующего проекта в Альбакор

Чтобы дать вам представление о том, как вы можете использовать Albacore, мы создадим новый проект в Visual Studio, добавим Rakefile, а затем добавим некоторые задачи для обработки компиляции проекта, запуска модульных тестов, управления AssemblyInfo.cs и подготовки проекта. для развертывания.

Начнем с создания приложения ASP.NET MVC по умолчанию в Visual Studio. Я выбрал Файл -> Новый проект и создал новое веб-приложение ASP.NET MVC 4 (если у вас не установлен ASP.NET MVC 4, любое другое веб-приложение ASP.NET должно работать так же хорошо):

Когда мне предложили, я выбрал шаблон Интернет-приложения и также создал проект модульного тестирования:

Ваш проект должен выглядеть примерно так:

AlbacoreDemo
— AlbacoreDemo
— AlbacoreDemo.Tests
— AlbacoreDemo.sln

view raw
gistfile1.txt
hosted with ❤ by GitHub

Теперь давайте создадим наш Rakefile и начнем добавлять некоторые задачи:

  1. Создайте текстовый файл с именем Rakefile в корневой папке вашего проекта (при желании вы можете дать ему расширение .rb ).
  2. Добавьте следующие строки:
require ‘albacore’
task :default => [:msbuild]
msbuild :msbuild do |msb|
msb.properties = { :configuration => :Debug }
msb.targets = [ :Clean, :Build ]
msb.solution = «AlbacoreDemo.sln»
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Первая строка делает задачи Albacore доступными для нас. Далее мы создаем задачу по default и устанавливаем задачу msbuild как зависимость. Затем мы определяем задачу msbuild , которая скомпилирует наш код для нас, используя решение и файлы проекта, уже созданные Visual Studio. Мы устанавливаем properties сборки для использования конфигурации отладки, устанавливаем, какие цели мы хотим вызвать, и msbuild задаче msbuild где найти файл решения. Обратите внимание, что путь к файлу sln зависит от расположения файла Rake.

Чтобы убедиться, что это работает, откройте командную строку, перейдите в корневую папку вашего проекта и введите в командной строке следующее:

 $> rake 

Это вызывает задачу по default , которая, в свою очередь, вызывает задачу msbuild и компилирует наш проект.

  1. Затем создайте задачу mstest для обработки наших модульных тестов:
mstest :mstest => [:msbuild] do |mstest|
mstest.command = «C:/Program\ Files\ (x86)/Microsoft Visual Studio 10.0/Common7/IDE/mstest.exe»
mstest.assemblies «AlbacoreDemo.Tests/bin/Debug/AlbacoreDemo.Tests.dll»
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Мы сообщаем задаче mstest, где найти исполняемый файл mstest, и указываем путь к файлу dll, содержащему тесты, которые мы хотим запустить. Мы также дали задаче зависимость от задачи msbuild , так как мы не сможем запустить тесты, если проект не был скомпилирован. Чтобы проверить это, вернитесь в командную строку и введите следующее:

 $> rake mstest 

Вы должны увидеть результаты теста, и все должно пройти.

  1. Давайте добавим задачу, чтобы заполнить наш класс AssemblyInfo.cs правильной информацией. Сначала вам нужно установить гем version_bumper :
 $> gem install version_bumper 

version_bumper требует текстовый файл для хранения номера текущей версии. Создайте текстовый файл с именем VERSION в корневой папке вашего проекта и добавьте номер версии для вашего проекта в формате #. #. #. #. Моя выглядит так:

1.0.0.0

view raw
gistfile1.txt
hosted with ❤ by GitHub

Загрузите version_bumper используя require , затем добавьте задачу assemblyinfo :

require ‘albacore’
require ‘version_bumper’
# snip
assemblyinfo :assemblyinfo do |asm|
asm.version = bumper_version.to_s
asm.file_version = bumper_version.to_s
asm.company_name = «ACME»
asm.product_name = «AlbacoreDemo»
asm.copyright = «Wile E. Coyote»
asm.output_file = «AlbacoreDemo/Properties/AssemblyInfo.cs»
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Чтобы проверить это, введите в командной строке следующую команду:

 $> rake assemblyinfo 

затем откройте файл AlbacoreDemo / Properties / AssemblyInfo.cs, и вы увидите, что соответствующие свойства были установлены соответствующим образом:

using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyCompany(«ACME«)]
[assembly: AssemblyProduct(«AlbacoreDemo«)]
[assembly: AssemblyCopyright(«Wile E. Coyote«)]
[assembly: AssemblyVersion(«1.0.0.0«)]
[assembly: AssemblyFileVersion(«1.0.0.0«)]

view raw
gistfile1.cs
hosted with ❤ by GitHub

Вероятно, мы захотим, чтобы задача assemblyinfo запускалась каждый раз, когда мы компилируем наш проект, поэтому добавьте его в качестве зависимости для задачи msbuild :

msbuild :msbuild => [:assemblyinfo] do |msb|
# snip
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

  1. Наконец, давайте добавим output задачу, которая подготовит все файлы, необходимые для развертывания сайта:
output :output do |out|
out.from ‘AlbacoreDemo’
out.to ‘deploy’
out.file ‘Web.Debug.config’, :as => ‘Web.config’
out.file ‘global.asax’
out.file ‘favicon.ico’
[‘bin’, ‘content’, ‘images’, ‘scripts’, ‘views’].each do |d|
out.dir d
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Сначала мы сообщаем задачу, откуда мы копируем, и куда. Затем мы указываем файлы, которые мы хотим скопировать, используя out.file , и каталоги, которые мы хотим скопировать с помощью out.dir . Обратите внимание на строку out.file 'Web.Debug.config', :as => 'Web.config' .

Это похоже на преобразования web.config , но AFAIK фактически не выполняет преобразования; он просто копирует файл. В зависимости от того, насколько вы зависимы от преобразований web.config, используйте YMMV, и вы можете получить лучшие результаты, добавив преобразования config как еще одну цель в задачу msbuild .

  1. Теперь мы добавили нужные нам задачи, их можно немного привести в порядок, добавив
    блок configure :
Albacore.configure do |config|
config.mstest.command = «C:/Program\ Files\ (x86)/Microsoft Visual Studio 10.0/Common7/IDE/mstest.exe»
config.msbuild.targets = [ :Clean, :Build ]
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Здесь мы устанавливаем путь к исполняемому файлу mstest и устанавливаем цели по умолчанию для msbuild . Соответствующие строки в msbuild и mstest могут быть удалены.

Полный Rakefile теперь выглядит следующим образом. Обратите внимание, что мы изменили задачу по default чтобы она собирала, тестировала и подготовила наш сайт к развертыванию:

require ‘albacore’
require ‘version_bumper’
Albacore.configure do |config|
config.mstest.command = «C:/Program\ Files\ (x86)/Microsoft Visual Studio 10.0/Common7/IDE/mstest.exe»
config.msbuild.targets = [ :Clean, :Build ]
end
task :default => [:msbuild, :mstest, :output]
desc «Builds the project using the MSBuild project files»
msbuild :msbuild => [:assemblyinfo] do |msb|
msb.properties = { :configuration => :Debug }
msb.solution = «AlbacoreDemo.sln»
end
desc «Runs the tests in the AlbacoreDemo.Tests project»
mstest :mstest => [:msbuild] do |mstest|
mstest.assemblies «AlbacoreDemo.Tests/bin/Debug/AlbacoreDemo.Tests.dll»
end
desc «Updates AssemblyInfo version number»
assemblyinfo :assemblyinfo do |asm|
asm.version = bumper_version.to_s
asm.file_version = bumper_version.to_s
asm.company_name = «ACME»
asm.product_name = «AlbacoreDemo»
asm.copyright = «Wile E. Coyote»
asm.output_file = «AlbacoreDemo/Properties/AssemblyInfo.cs»
end
desc «Prepares the files needed for deployment»
output :output do |out|
out.from ‘AlbacoreDemo’
out.to ‘deploy’
out.file ‘Web.Debug.config’, :as => ‘Web.config’
out.file ‘global.asax’
out.file ‘favicon.ico’
[‘bin’, ‘content’, ‘images’, ‘scripts’, ‘views’].each do |d|
out.dir d
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Альбакор доступен на GitHub . В вики есть обширная документация по всем поддерживаемым задачам, так что это хорошее место, чтобы узнать больше информации. Он также содержит ссылку на некоторые проекты, использующие Albacore в реальной жизни , чтобы вы могли увидеть, как он используется в производстве.

Надеюсь, это дало вам представление о том, что вы можете делать с Albacore, и о том, как вы можете использовать его для создания существующих проектов .NET.