Hlavní navigace

Utilitky pro Ruby: buildovací systém Rake IV

Jakub Šťastný

V dnešním díle seriálu o utilitkách pro Ruby budeme pokračovat v popisu buildovacího systému Rake a konkrétně se budeme věnovat třídě FileList. Povíme si také další podrobnosti o vyvolávání jednotlivých tasků přímo z těla jiného tasku a řekneme si také, jakých zajímavých úprav doznal modul FileUtils v Rake.

FileUtils

Modul FileUtils ze standardní knihovny Ruby jistě znáte. Rake jej intenzivně využívá a dokonce si jej pro své potřeby dále rozšiřuje. Čím nám tedy mohou být FileUtils užitečné?

  • cd
  • pwd
  • mkdir
  • mkdir_p
  • ln
  • ln_s
  • ln_sf
  • cp
  • cp_r
  • mv
  • rm
  • rm_r
  • rm_rf
  • install
  • chmod
  • touch

S výše uvedenými metodami se pracuje stejně jako se stejnojmennými příkazy v Linuxu, samozřejmě s tím rozdílem, že je třeba řídit se syntaxí Ruby a tedy místo mezery coby oddělovače použijete čárku a je samozřejmě také třeba explicitně označit řetězce. Takže například kopírování bude vypadat takto:

cp "/path/to/source", "/path/to/destination"

FileUtils zpravidla umí pracovat s polem souborů ( cp %w(source_I source_II source_III) "destination") a rozumějí si s argumenty jako :verbose => true a :nowrite => true.

Mezi nejvýznamnější metody přidané do FileUtils v Rake patří sh a ruby. S metodou sh jsme se již seznámili. Jejím smyslem je spustit externí příkaz a jeho výstup vypisovat. Podobně funguje metoda ruby, která dělá de facto totéž, ale nikoliv pro shell, nýbrž pro Ruby.

Mezi další rozšíření FileUtils v Rake patří například možnost globálně či lokálně nastavit verbose flag. To se dělá metodou verbose(boolean). Pokud bude následovat blok kódu, bude verbose flag nastaven lokálně právě pro něj, v opačném případě bude nastaven globálně.

verbose(true) do
  kód, v němž je verbose flag nastaven na true
end

FileList

Protože Rake má velmi často na starost manipulaci s různými soubory a Dir.glob již požadavkům tvůrců nestačilo, přichází zde na řadu FileList. FileList se chová podobně jako pole, umí však manipulovat s cestami a názvy souborů a defaultně ignoruje všudypřítomné podadresáře .svn, či záložní soubory *.bak a *~.

FileList znají i metody sub a sub!, jediné omezení je, že neumějí pracovat s blokem kódu, jako to umí ekvivalentní metody třídy String. K čemu je to dobré? Například když chcete tvořit jednotlivé výstupní .o soubory ze zdrojových .c souborů a je třeba na to napsat pravidlo.

FileList['src/**/*.java'].sub(%r{^src/(.*)\.java}, "classes/\\1.class")

Užitečná je rovněž metoda egrep, která na standardní výstup tiskne řádky vyhovující námi zadanému vzoru, stejně jako to dělá stejnojmenný unixový příkaz. Jednoduchý příklad napoví více:

desc "Look for TODO and FIXME tags in the code"
task :todo do
  FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/
end

Co je dále vhodné vědět o Rake

Každý úkol může být specifikován více než jednou, každá jeho další specifikace přidá jeho závislosti a akce do existující definice. Díky tomu je možné například specifikovat závislosti na začátku souboru a akce teprve později.

Čas od času se hodí vyvolat určitý úkol přímo z definice úkolu dalšího:

task :primary do
  Rake::Task[:secondary].invoke
end

Zde je na místě podotknout, že každý úkol běží nanejvýše jednou, takže pokud již v daném běhu proběhl, ani Rake::Task[:tas­kname].invoke ani uvedení v závislosti jiného tasku jej nevyvolá znovu, zkrátka proto, že závislost již byla splněna.

Příště

V příštím dílu našeho povídání o Rake  se budeme věnovat automatizované tvorbě tasků, řekneme si něco o knihovnách pro různé typy úkolů a ukážeme si konečně nějaké delší ukázky z praxe. Pokud zbude čas, zabrousíme do problematiky specifické pro Ruby on Rails a povíme si jak o již předpřipravených úkolech pro Rake obsažených v každé RoR aplikaci, tak o specifikách tvorby tasků v Rails.

Odkazy

Našli jste v článku chybu?