Hlavní navigace

Utilitky pro Ruby: buildovací systém Rake II

Jakub Šťastný 14. 9. 2007

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:

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

Našli jste v článku chybu?
Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí