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[:taskname].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.