Marcin Wolański
"It is not the critic who counts: not the man who points out how the strong man stumbles or where the doer of deeds could have done better. The credit belongs to the man who is actually in the arena [...]"

Wykorzystanie Rake do budowy projektu .NET

środa, 6 października 2010 roku

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.

z tagami .NET

blog comments powered by Disqus