Hlavní navigace

Utilitky pro Ruby: buildovací systém Rake VI

8. 10. 2007
Doba čtení: 4 minuty

Sdílet

V posledním díle seriálu o utilitkách pro Ruby věnovaném systému Rake se budeme zabývat využití Rake ve webovém frameworku Ruby on Rails. Nakonec si vezmene křišťálovou kouli a podíváme se do budoucnosti, jinými slovy podíváme se na chystané novinky v Rake.

Rake v Ruby on Rails

Rake má významnou roli při vývoji aplikací v Ruby on Rails, ostatně věřím, že rake db:migrate jste spouštěli tolikrát, že vás toto tvrzení ani na okamžik nemůže překvapit.

Od doby, co disponuje Rake možností definování různých namespace, jich Rails důsledně využívají, čímž se velké množství tasků stává logické a přehledné. Základní namespace jsou db, doc, log, rails, test a tmp.

Tasky v namespace db logicky poskytují operace pro práci s databází. Sem patří onen profláklý task db:migrate, který, pokud to náhodou ještě někdo neví, slouží k migrování databáze ze souborů v db/migrate. Defaultně se migruje na nejvyšší dostupnou verzi, a pokud si přejete, aby se migrovalo na některou konkrétní, specifikujte ji parametrem VERSION=X, který uvedete za db:migrate. Dejme tomu, že mám tyto migrace:

blog> ls db/migrate/
001_create_articles.rb  005_add_articles.rb     009_create_authors.rb
002_create_posts.rb     006_create_news.rb      010_add_authors.rb
003_create_tags.rb      007_add_news.rb         011_create_projects.rb
004_add_tags.rb         008_add_posts.rb        012_add_projects.rb

Příkazem rake db:migrate VERSION=5 migrujeme soubory 001_create_ar­ticles.rb, 002_create_pos­ts.rb, 003_create_tags.rb, 004_add_tags.rb a 005_add_articles­.rb, jinými slovy číslo migrace odpovídá tomu, čemu Rails říkají verze.

V namespace doc nalezneme task app, který do doc/app vygeneruje RDoc dokumentaci k aplikaci, task reapp, který ji přegeneruje a task clobber_app, který ji odstraní. Podobně funguje plugins a clobber_plugins, které generují, resp. mažou dokumentaci ke všem nainstalovaným pluginům.

Tasky v namespace test poskytují rozhraní pro testování aplikace. Nejrozsáhlejší testování provádí rake test, který spustí všechny jednotkové a funkcionální testy (samozřejmě není z namespace test, ale je logické jej zmínit právě na tomto místě). Pouze jednotkové testy lze spustit příkazem rake test:units, testy z test/functional příkazem rake test:functionals a testy z test/integration příkazem rake test:integration. Všechny pluginy se otestují pomocí rake test:plugins, když specifikujete PLUGIN=X, bude testován pouze vámi požadovaný plugin.

Tasky obsažené v namespace tmp jsou určeny zpravidla na čištění dočasných souborů: tmp:cache:clear maže vše v tmp/cache, tmp:pids:clear soubory v tmp/pids, tmp:sessions:clear soubory v tmp/sessions  a tmp:sockets:clear zase v tmp/sockets. Nejúčinnější „čistič” je tmp:clear, který maže session, cache a socket soubory z tmp. Pokud si smažete celý obsah složky tmp, task tmp:create obnovuje její defaultní strukturu.

Poslední dva tasky, které zmíním, jsou log:clear a stats. První zmíněný maže obsah všech souborů *.log ve složce log/ a druhý vypisuje statistiky z aplikace, poví vám například, kolik řádků kódu, metod či tříd mají vaše kontrolery, helpery, modely a další:

blog> rake stats
(in /Users/botanicus/Public/blog)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |   241 |   189 |      10 |      43 |   4 |     2 |
| Helpers              |    24 |    23 |       0 |       1 |   0 |    21 |
| Models               |    29 |    24 |       6 |       2 |   0 |    10 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Components           |     0 |     0 |       0 |       0 |   0 |     0 |
| Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 |
| Functional tests     |   162 |   117 |      18 |      27 |   1 |     2 |
| Unit tests           |    74 |    55 |       6 |       9 |   1 |     4 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |   530 |   408 |      40 |      82 |   2 |     2 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 236     Test LOC: 172     Code to Test Ratio: 1:0.7

Vlastní tasky v railsové aplikaci

Doporučená cesta vlastních tasků v Ruby on Rails se trochu liší od způsobu, na který jsme zvyklí z běžných nerailsových aplikací. Když se v hlavní složce aplikace podíváte do souboru Rakefile, budete upozorněni, že své tasky máte ukládat do složky lib/tasks a že mají mít příponu .rake, čili to bude vypadat asi takto:

CS24 tip temata

blog> cat lib/tasks/hello.rake
task :hello do
  puts("Hello from Rake in Ruby on Rails application!")
end
blog> rake hello
(in /Users/botanicus/Public/blog)
Hello from Rake in Ruby on Rails application!

Co se v Rake chystá nového?

Rake se stále poměrně rychle vyvíjí, například metoda multitask byly přidána v nynější aktuální verzí, tedy v Rake 0.7.3. Do budoucna se plánuje do Rake přidat lepší podporu pro specifické tasky. V tomto kontextu se nejčastěji mluví o tascích pro kompilaci javovského kódu. Mluví se také o defaultních tascích, které by běžely kdekoliv i bez přítomnosti jakéhokoliv souboru Rakefile, o autogenerování závislostí a o lepší podpoře instalačních utilitek. Ze závažných problémů by měl v „balíčkotvorných” tascích být řešen problém kolize jmen při tvorbě více balíčků a chystá se také možnost vypnutí warning módu.

Příště

Po pěti dílech strávených povídáním o Rake zase zvedneme kotvy a posuneme se o něco dále. Protože dokumentace kódu je velmi důležitá činnost, již by měl každý programátor důsledně provádět, budeme se věnovat právě dokumentaci – řeč bude o ri  a rdoc.

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.