Если вы являетесь разработчиком .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 |
Здесь у нас есть 3 задачи: foo
, bar
и default
. default
имеет две зависимости: задачи foo
и bar
. Чтобы запустить Rake, вы rake
в командной строке. Затем он ищет файл Rake в текущем каталоге и по умолчанию запускает задачу по умолчанию. Чтобы запустить другую задачу, вы должны передать имя задачи в качестве аргумента Rake, например, rake foo
. Используя приведенный выше пример Rakefile, вы можете увидеть, как выходные данные отличаются:
$> rake | |
foo | |
bar | |
$> rake foo | |
foo | |
$> rake bar | |
bar |
Установка Альбакора
Поскольку 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 |
Теперь давайте создадим наш Rakefile и начнем добавлять некоторые задачи:
- Создайте текстовый файл с именем
Rakefile
в корневой папке вашего проекта (при желании вы можете дать ему расширение.rb
). - Добавьте следующие строки:
require ‘albacore’ | |
task :default => [:msbuild] | |
msbuild :msbuild do |msb| | |
msb.properties = { :configuration => :Debug } | |
msb.targets = [ :Clean, :Build ] | |
msb.solution = «AlbacoreDemo.sln» | |
end |
Первая строка делает задачи Albacore доступными для нас. Далее мы создаем задачу по default
и устанавливаем задачу msbuild
как зависимость. Затем мы определяем задачу msbuild
, которая скомпилирует наш код для нас, используя решение и файлы проекта, уже созданные Visual Studio. Мы устанавливаем properties
сборки для использования конфигурации отладки, устанавливаем, какие цели мы хотим вызвать, и msbuild
задаче msbuild
где найти файл решения. Обратите внимание, что путь к файлу sln
зависит от расположения файла Rake.
Чтобы убедиться, что это работает, откройте командную строку, перейдите в корневую папку вашего проекта и введите в командной строке следующее:
$> rake
Это вызывает задачу по default
, которая, в свою очередь, вызывает задачу msbuild
и компилирует наш проект.
- Затем создайте задачу 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 |
Мы сообщаем задаче mstest, где найти исполняемый файл mstest, и указываем путь к файлу dll, содержащему тесты, которые мы хотим запустить. Мы также дали задаче зависимость от задачи msbuild
, так как мы не сможем запустить тесты, если проект не был скомпилирован. Чтобы проверить это, вернитесь в командную строку и введите следующее:
$> rake mstest
Вы должны увидеть результаты теста, и все должно пройти.
- Давайте добавим задачу, чтобы заполнить наш класс AssemblyInfo.cs правильной информацией. Сначала вам нужно установить гем
version_bumper
:
$> gem install version_bumper
version_bumper
требует текстовый файл для хранения номера текущей версии. Создайте текстовый файл с именем VERSION
в корневой папке вашего проекта и добавьте номер версии для вашего проекта в формате #. #. #. #. Моя выглядит так:
1.0.0.0 |
Загрузите 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 |
Чтобы проверить это, введите в командной строке следующую команду:
$> 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«)] |
Вероятно, мы захотим, чтобы задача assemblyinfo
запускалась каждый раз, когда мы компилируем наш проект, поэтому добавьте его в качестве зависимости для задачи msbuild
:
msbuild :msbuild => [:assemblyinfo] do |msb| | |
# snip | |
end |
- Наконец, давайте добавим
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 |
Сначала мы сообщаем задачу, откуда мы копируем, и куда. Затем мы указываем файлы, которые мы хотим скопировать, используя out.file
, и каталоги, которые мы хотим скопировать с помощью out.dir
. Обратите внимание на строку out.file 'Web.Debug.config', :as => 'Web.config'
.
Это похоже на преобразования web.config , но AFAIK фактически не выполняет преобразования; он просто копирует файл. В зависимости от того, насколько вы зависимы от преобразований web.config, используйте YMMV, и вы можете получить лучшие результаты, добавив преобразования config как еще одну цель в задачу msbuild
.
- Теперь мы добавили нужные нам задачи, их можно немного привести в порядок, добавив
блок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 |
Здесь мы устанавливаем путь к исполняемому файлу 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 |
Альбакор доступен на GitHub . В вики есть обширная документация по всем поддерживаемым задачам, так что это хорошее место, чтобы узнать больше информации. Он также содержит ссылку на некоторые проекты, использующие Albacore в реальной жизни , чтобы вы могли увидеть, как он используется в производстве.
Надеюсь, это дало вам представление о том, что вы можете делать с Albacore, и о том, как вы можете использовать его для создания существующих проектов .NET.