Przy okazji rozpoczęcia nowego projektu chciałem w prosty sposób umożliwić budowę projektu z linii komend. Do tej pory używałem do tego NAnta, ale tym razem chciałem dać szansę narzędziu, z którego korzysta wiele projektów open-source: Rake.

Wymagania miałem dwa: kompilacja projektu wykorzystującego .NET 4.0 oraz uruchomienie testów jednostkowych wykorzystujących bibliotekę xUnit.net.

Rozpocząłem od ściągnięcia i instalacji środowiska Ruby dla Windows. Aby nie wynajdywać od nowa koła, zainstalowałem bibliotekę Albacore, która znacznie ułatwia pracę ze skryptem wykorzystywanym do budowy projektu .NET. Aby zainstalować Albacore, należy w wierszu poleceń uruchomić komendę:

gem install albacore

Mój projekt ma w uproszczeniu taką strukturę:

  • MyApplication\lib
  • MyApplication\lib\xunit-1.6.1
  • MyApplication\source
  • MyApplication\source\MySolution.sln
  • rakefile.rb

Aby nie musieć wskazywać w wywołaniu w wierszu poleceń narzędzia rake pliku ze zadaniami, skrypt budujący projekt należy utworzyć w pliku o nazwie rakefile, Rakefile, rakefile.rb lub Rakefile.rb. Ja wybrałem sobie nazwę rakefile.rb. Dzięki temu, aby wywołać defaultowe zadanie dla Rake, będąc w katalogu projektu, w wierszu poleceń wystarczy wykonać komendę:

rake nazwa_zadania

Na początku pliku rakefile.rb deklarujemy użycie biblioteki Albacore:

require 'albacore'

Następnie dodajemy zadanie budujące solucję:

desc "Build solution"
msbuild :build do |msb|
    msb.path_to_command =  File.join(ENV['windir'], 'Microsoft.NET',
        'Framework',  'v4.0.30319', 'MSBuild.exe')
    msb.properties :configuration => :Debug
    msb.targets :Clean, :Build
    msb.solution = "source/MySolution.sln"
end

Pierwsza linijka zawiera opis zadania i ma tylko znaczenie dokumentujące. W drugiej linii msbuild oznacza nazwę zadania z Albacore, a :build alias dla tego zadania. Dzięki temu, aby zbudować projekt, w wierszu poleceń należy wykonać komendę:

rake build

Jeśli pominąłbym alias, to budowę solucji mógłbym uruchomić tak:

rake msbuild

Trzecia linia nie wygląda najlepiej, ale jest niestety konieczna, jeśli projekt używa .NET 4.0. A to dlatego, że zadanie msbuild z Albacore domyślnie używa .NETa 3.5 i wykonanie go, bez zdefiniowania ścieżki do msbuild.exe z właściwego frameworka, zakończy się błędem.

Pozostała część kodu zadania jest oczywista: chcemy zbudować solucję MySolution.sln w trybie Debug, uprzednio robiąc porządki.

Zadanie uruchomienia testów jednostkowych jest krótkie:

desc "Run unit tests"
xunit :test => :build do |xunit|
    xunit.path_to_command = "lib/xunit-1.6.1/xunit.console.clr4.exe"
    xunit.assembly = "unit_tests_file.dll"
end

Podajemy ścieżkę do narzędzia uruchamiającego z wiersza poleceń testy jednostkowe wykorzystujące bibliotekę xUnit.net i wskazujemy bibliotekę z naszymi testami.

Aby uruchomić testy jednostkowe, w wierszu poleceń należy wykonać komendę:

rake test

Jeśli mamy jakieś zadanie, które wykonujemy wyjątkowo często, to przed definicją zadań można dodać linię:

task :default => :nazwa_lub_alias_zadania

Dzięki temu, aby wykonać to zadanie, w wierszu poleceń wystarczy wywołać komendę:

rake

Nie bawiłem się zbyt długo tym rozwiązaniem, ale póki co, przynajmniej dla mnie, nie ma porównania czytelność skryptu napisanego w Ruby z plikami dla NAnta czy też msbuilda. Chcę jeszcze dodać kilka różnych zadań i zintegrować wszystko z narzędziem CI. Zobaczymy, czy się uda.