Hlavní navigace

Utilitky pro Ruby: balíčkovací systém RubyGems potřetí

Jakub Šťastný

V minulých dílech jsme se naučili RubyGems používat z uživatelského a developerského hlediska, dnes to zkusíme z toho maintainerského. Řekneme si více o formátu gemovských balíčků a hned si také ukážeme, jak si vytvořit a podepsat vlastní gemový balíček.

Tvorba vlastních gemů

Tvorba vlastního balíčku je až překvapivě jednoduchá – stačí jednoduše napsat soubor s metadaty a na ten posléze zavolat příkaz gem build. Tak se do toho dáme, nejdříve ta metadata …

Soubor gemspec

Soubor gemspec je obyčejný skript v Ruby, ve kterém vytvoříme objekt Gem::Specification a předáme mu informace o našem balíčku. Na jeho názvu ani příponě nesejde, nicméně bývá zvykem pojmenovávat jej <package_name>.gemspec.

Minimální soubor gemspec může vypadat třeba takto:

Gem::Specification.new do |specification|
  specification.name    = "Hello world"
  specification.version = "0.0.1"
  specification.summary = "Just a hello world."
  specification.files   = ["hello.rb"]
end

Vhodné je také přidat informace o autorovi:

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

Samozřejmě není problém doplnit závislosti:

s.add_dependency(%q<some_library>, [">= 1.0.0"])

Pokud k balíčku existuje dokumentace, je třeba na ni RubyGems také upozornit:

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

Celý specfile může nakonec vypadat třeba takto:

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        = Dir['lib/**/*.rb'] + Dir['bin/*.rb']
  specification.require_path = 'lib'

  # dependencies
  s.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

Vytvoření balíčku

Pokud máme náš specfile hotov, stačí již jen zavolat příkaz gem build soubor.gemspec a vytvořit tak balíček: .

Chcete-li balíček rovnou nainstalovat, stačí opět pouze gem install <package>, protože tento příkaz nejprve hledá v aktuálním adresáři, a pokud zde balíček nalezne, logicky jej již nehledá na serveru.

Formát balíčků

Co se vlastních balíčků týče, RubyGems si nevymýšlí žádné podivnosti. Ačkoliv balíček končí příponou gem, nenechte se zmást – jedná se o úplně obyčejný tar archiv, který bez problémů ve vaší oblíbené distribuci rozbalíte. Uvnitř jsou dva soubory – metadata.gz obsahující pochopitelně metadata balíčku a data.tar.gz s vlastním obsahem balíčku.

Podepisování gemů

Aby byly naše balíčky důvěryhodné, je třeba je také podepsat. Nejprve příkazem gem cert --build <my_mail> vygenerujeme veřejný certifikát a privátní klíč, naleznete jej v souborech gem-public_cert.pem a gem-private_key.pem.

Nyní otevřete soubor gemspec a připište do něj:

specification.signing_key = '/path/to/your/gem-private_key.pem'
specification.cert_chain  = ['gem-public_cert.pem']

Aby byl náš podpis ověřitelný, je třeba jej příkazem gem cert --add gem-public_cert.pem přidat jako důvěryhodný zdroj.

A to je vše přátelé, když nyní přes gem build opětovně vytvoříte balíček, bude v něm navíc soubor data.tar.gz.sig a metadata.gz.sig naznačující, že vše se povedlo jak mělo.

Když budete nyní chtít využívat výhod vyšší bezpečnosti, můžete při instalaci parametrem -P specifikovat míru bezpečnosti. Povolené hodnoty jsou: NoSecurity, LowSecurity, MediumSecurity a HighSecurity, vyčet rozdílů mezi nimi najdete v oficiální dokumentaci.

Není doufám třeba připomínat, že privátní klíč je nezbytné dát mimo dosah ostatních, ideálně na externí médium, protože když se dostane do nepovolaných rukou, může za vás balíčky podepisovat cizí osoba.

Sofistikovanější tvorba gemů

Tvorba gemů je ukázkovým příkladem pro použití některého buildovacího systému. Jistě nejlepší alternativou pro Ruby je systém Rake, o kterém si povíme něco v některém z příštích dílů. Protože Rake má na RubyGems poměrně pěknou vazbu, lze tím dovést tvorbu gemů k naprosté dokonalosti.

Jak jednoduše a přehledně prohlížet nainstalované gemy?

RubyGems v sobě obsahují i jednoduchý webový servřík, který nám umožní jednoduše prohlížet nainstalované gemy včetně jejich dokumentace. Zacházení s ním je prosté, stačí jej pustit příkazem gem_server a v prohlížeči zadat http://localhos­t:8088

gemserver

Takto vypadá rozhraní pro prohlížení gemů.

Pokud chcete, není problém si vytvořit přímo vlastní server, ze kterého bude možno gemy instalovat.

Není od věci vědět, že RubyForge automaticky zpřístupňuje kterékoliv gemy uploadované do stahovací části a je tedy možné je rovnou instalovat přes RubyGems. 

Doplňkový software

V duchu klasického unixového příkazu which existuje i jeho gemový bratříček – gemwhich. Ten hledá v Ruby knihovnách a RubyGems repozitářích.

$ gemwhich rake
/usr/lib/ruby/site_ruby/1.8/rake.rb
$ gemwhich rake/testtask
/usr/local/lib/ruby/gems/1.8/gems/rake-0.4.15/lib/rake/testtask.rb
$ gemwhich socket
/usr/local/lib/ruby/1.8/i686-linux/socket.so

S RubyGems je dále distribuována utilitka gemri, která slouží stejně jako ri, tedy pro zobrazování dokumentace, ale pro knihovny instalované přes RubyGems,

Příště

Po třech dílech věnovaných gemům se budeme věnovat dalším utilitkám souvisejících nějakým způsobem s distribucí kódu psaného v Ruby, tentokrát se zaměříme převážně na utilitky umožňující distribuci kódu a interpretu v jediném souboru.

Odkazy

Našli jste v článku chybu?