Hlavní navigace

Utilitky pro Ruby: buildovací systém Rake II

14. 9. 2007
Doba čtení: 3 minuty

Sdílet

V minulém díle našeho seriálu o utilitkách pro Ruby jsme se se systémem Rake seznámili, dnes si povíme více o práci s ním – věnovat se budeme parametrům Rake z příkazové řádky a zastavíme se také u různých možností závislostí rakeových úkolů.

Parametry z příkazové řádky

Rake stejně jako téměř každá jiná unixová řádková utilitka umožňuje ovlivňovat své chování pomocí parametrů. Jeho obecná syntaxe vypadá takto:

rake [options] [variable=value] [task]

Patrně nejužitečnější parametr vůbec je --tasks, který slouží k vypsání tasků. Optimálně mu lze regulárním výrazem napovědět, jaké tasky si přejeme vypsat:

rubybook> rake --tasks ^cl
(in /Users/botanicus/Documents/Publications/RubyBook)
rake clean    # Remove any temporary products.
rake clobber  # Remove any generated file.

--prereqs čili -P umožňuje vypsání úkolů s jejich závislostmi:

rubybook> rake -P
(in /Users/jakubstastny/Documents/Publications/RubyBook)
rake backup
    clean
rake build
    gencontent
rake clean
rake clobber
    clean
rake default
    build
    clean
    rubybook.tex
(... zkráceno ... )

Z příkazové řádky lze též jednoduše nastavit hodnotu proměnné. Ta bude v Rakefile dostupná skrze konstantu ENV, která standardně obsahuje proměnné prostředí:

task :debug do
  puts("Ruby: #{ENV["ruby"]}")
end
rubybook> rake ruby=`which ruby` debug
(in /Users/botanicus/Documents/Publications/RubyBook)
Ruby: /usr/local/bin/ruby

Pro úplnost raději dodám, že mezi proměnnou, rovná se a hodnotou proměnné nesmí být mezera. Je tomu tak proto, že shell mezeru používá pro oddělování parametrů – variable=name je jeden argument, kdežto variable = name jsou argumenty tři – variable, = a name.

Velmi užitečný je též parametr --dry-run či zkráceně -n, který umožňuje vypsání prováděných akcí, aniž by byly skutečně spuštěny:

rubybook> rake -n backup
(in /Users/botanicus/Documents/Publications/RubyBook)
** Invoke backup (first_time)
** Invoke clean (first_time)
** Execute (dry run) clean
** Execute (dry run) backup

Pro ladění se často používá --trace, -t, který vypisuje průběh úkolu:

rubybook> rake --trace build
(in /Users/jakubstastny/Documents/Publications/RubyBook)
** Invoke build (first_time)
** Invoke gencontent (first_time)
** Execute gencontent
** Execute build

 TeXExec 5.2.4 - ConTeXt / PRAGMA ADE 1997-2005

            executable : pdfetex
                format : cont-en
(Průběh sázení dokumentu.)

Z dalších užitečných parametrů bych uvedl --libdir=<directory> či zkráceně -I který umožňuje přidání námi zadané složky do proměnné $: , v níž jsou vyhledávány knihovny pro Ruby a --require [file] čili -r [file] umožňující nahrání požadovaného souboru před spuštěním Rakefile. Za povšimnutí stojí také volba --rakefile [rakefile] či -f [rakefile], která umožňuje zadat jméno souboru, který se použije jako Rakefile. Rake má ještě spoustu dalších užitečných parametrů, nemá však cenu zde suplovat manuál, rake --help případným zájemcům poví více.

Závislosti pod lupou

Jak již víte z minula, Rake umožňuje vytvářet závislosti úkolů. Nejjednodušší cestou je jednoduchá závislost:

task :backup => :clean do
  block
end
Vše, co je zapsáno v Rakefile, je běžný kód v Ruby, ačkoliv právě tvorba tasků tak nemusí vypadat. Tvorba úkolů funguje jako volání metody task, které předáme hash s klíčem :name a hodnotou  :clean:
hash = Hash.new
task(hash[:backup] = :clean) do
  (block)
end

Když zavoláme rake backup, Rake najde task backup a všimne si, že ten závisí na úkolu clean. Vykoná tedy task clean a vrátí se k tasku backup, který nyní již vykoná. To není nic složitého a nepochopitelného, ostatně zmínil jsem to již minule.

Samozřejmě že mnohdy závislost na jednom tasku nestačí, v tom případě uvedeme jednoduše pole s úkoly, na nichž ten aktuální závisí:

task :build => [:build, :clean] do
  block
end

Co ale dělat, když je task v jiném namespace? Odpověď je prostá – stačí uvést task ve tvaru "namespace:task", třeba takto:

task :build_all => ["main:build", "samples:build"]

Synonymní názvy pro různé úkoly

Jednomu úkolu lze jednoduše přiřadit různé názvy:

task :build => :build_all_files

Teď místo dlouhého rake build_all_files lze volat jednoduše pouze rake build. Tohoto triku lze šikovně využít například k určení tasku default:

CS24_early

task :default => :backup

Jak jste jistě pochopili, touto cestou jsem učinil defaultním taskem :backup a tedy volání rake bez parametrů zavolá právě jej.

Příště

V příštím díle se podíváme na další typy tasků jako jsou například paralelně spouštěné tasky či tasky souborové a dále se budeme věnovat knihovnám pro tvorbu úkolů – například knihovny pro snadnou tvorbu uklízecích tasků, tasků generujících rdoc dokumentaci či gemový balíček případně umožňující elegantní řešení běhu testů. Pokud zbude čas, přijdou na přetřes metody pro práci se systémem a soubory, řeč bude především o FileList.

Odkazy

Byl pro vás článek přínosný?

Autor článku

Jakub Šťastný byl v letech 2007 až 2008 redaktorem serveru Root.cz. Mezi jeho zájmy patří Linux, programování a typografický systém TeX.