Hlavní navigace

Utilitky pro Ruby: buildovací systém Rake IV

Jakub Šťastný 24. 9. 2007

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?
Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Lupa.cz: Slevové šílenství je tu. Kde nakoupit na Black Friday?

Slevové šílenství je tu. Kde nakoupit na Black Friday?

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

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

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

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

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

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

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

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

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

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

Podnikatel.cz: 1. den EET? Problémy s pokladnami

1. den EET? Problémy s pokladnami

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

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

Vypadl Google a rozbilo se toho hodně