Utilitky pro Ruby: buildovací systém Rake V

1. 10. 2007
Doba čtení: 3 minuty

Sdílet

V dnešním díle seriálu o utilitkách pro Ruby přijdou na přetřes jednotlivé knihovny pro tvorbu specifických tasků, naučíme se balit balíčky pomocí Rake, mazat dočasné soubory, ale také automatizovat testování naší aplikace a generovat dokumentaci.

Úklid souborů projektu

V prvním díle jsem ukázal, jak lze provést task clean. Popravdě řečeno, jeho podoba byla značně nedokonalá, nicméně byl to úvodní díl a nechtěl jsem zabíhat příliš do podrobností Rake – ten má totiž tento úkol dostupný skrze knihovnu rake/clean.

require "rake/clean"
CLEAN("*.log", "tmp/*")

A je to. Prosté a úsporné, jako ostatně každý správný kód v Ruby. Pokud chceme čistit ještě důkladněji, máme k dispozici task clobber ze stejné knihovny. Používá se stejně jako CLEAN, funguje na stejném principu, akorát před jeho provedením bude nejprve zavoláno rake clean. Kompletní podpora pro úklid projektu může v Rakefile vypadat například takto:

require "rake/clean"
CLEAN("*.log", "tmp/*")
CLOBBER.include("**/*.temp", "*.o")

Co se stane, když tyto úkoly zavoláme? Při každém zavolání tasku clean budou smazány logové soubory a soubory ve složce tmp, při každém zavolání tasku clobber bude nejprve zavolán task clean, a poté budou ještě navíc smazány soubory s příponou .temp ve všech podsložkách a všechny výstupní .o soubory.

Tvorba balíčků

Se sestavováním balíčků nám může pomoci knihovna rake/gempackagetask:

require 'rubygems'
Gem::manage_gems
require 'rake/gempackagetask'

spec = Gem::Specification.new do |specification|

  # informations about author
  specification.author       = "Botanicus"
  specification.email        = "stastny@iinfo.cz"
  specification.homepage     = "http://www.helloworldinruby.cz"

  # package informations
  specification.name         = "Hello world"
  specification.version      = "0.0.1"
  specification.summary      = "Just a hello world."
  specification.description  = "It only sais \"Hello world\" and exit."

  # files and paths
  specification.files        = FileList["{bin,tests,lib,docs}/**/*"].exclude("rdoc").to_a
  specification.require_path = 'lib'

  # dependencies
  specification.add_dependency(%q<some_library>, [">= 1.0.0"])

  # rdoc info
  specification.has_rdoc = true
  specification.extra_rdoc_files = Dir['[A-Z]*']
  specification.rdoc_options << '--title' <<  'Builder -- Easy XML Building'

end

Rake::GemPackageTask.new(spec) do |pkg|
  pkg.need_tar = true # chceme vytvorit i archiv tar?
  pkg.need_zip = true # chceme vytvorit i archiv zip?
end

Povšimněte si, že v gemové specifikaci nyní místo Dir používám FileList, což práci se soubory příjemně usnadňuje. Příjemné také je, že co se výstupních souborů týče, nejsme omezeni jen na gemy, ale balíčkovací knihovna umí produkovat i různé typy archivů od zipu, přes tar až po tar.gz a tar.bz2.

Přidáním tohoto kódu do vašeho Rakefile vám přibudou úkoly package, který slouží pro vytvoření balíčků v zadaných formátech, clobber_package pro smazání balíčků a repackage pro znovuvytvoření balíčků i pokud nejsou starší než zdrojové kódy. Akce clobber_package bude automaticky vyvolána pokud spustíme úkol clobber. Přejete-li si vytvořit pouze gemový balíček, použijte akci gem

Tvorba dokumentace

Knihovna rake/rdoctask automatizuje tvorbu pokumentace utilitkou rdoc:

require "rake/rdoctask"
Rake::RDocTask.new do |rdoc|
  rdoc.rdoc_dir = 'html'   # vystupni slozka s dokumentaci
  rdoc.template = 'kilmer' # sablona
  rdoc.options << '--line-numbers' # parametry rdoc
  rdoc.rdoc_files.add('README', 'MIT-LICENSE', 'TODO', 'CHANGES')
  rdoc.rdoc_files.add('lib/**/*.rb', 'doc/**/*.rdoc', 'test/*.rb')
end

Jak vidíte, knihovna je vystavěna se stejnou logikou jako knihovna pro tvorbu balíčků. Nepřekvapí tedy, že rake rdoc generuje dokumentaci, rake rerdoc ji přegenerovává a rake clobber_rdoc ji zase maže.

Testy

Testování aplikace je zcela klíčová, v praxi však také velmi často opomíjená část vývoje. V Rake nám s testováním pomůže knihovna rake/testtask:

require "rake/testtask"
Rake::TestTask.new do |t|
  t.libs << "test"
  t.test_files = FileList['test/test*.rb']
  t.verbose = true
end

Veškeré testy spustíme příkazem rake test, mnohdy však potřebujeme testovat pouze konkrétní soubor, což se dělá příkazem rake test TEST=file.rb.

Další knihovny pro Rake

Rake má samozřejmě více knihoven, než jsme si my v našem povídání stihli popsat, snad jen namátkou nejzajímavější z nich: Rake::Makefile­Loader slouží k nahrávání souborů Makefile, spoustu knihoven spolupracuje s SSH případně FTP a je určeno pro nahrání projektu na web, případně Rake::RubyFor­gePublisher slouží k přímému nahrání projektu na RubyForge.

bitcoin_skoleni

Příště

V posledním díle našeho seriálu věnovaném sestavovacímu systému Rake si povíme o jeho významu v Ruby on Rails a podíváme se také, co se chystá v příští verzi nového.

Poznámka: některé ukázky byly přejaty z www.noobkit­.com.

Odkazy

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.