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?

20. 8. 2007 20:19

repulsive (neregistrovaný)
aspoň v něčem jsi první, já ti to přeju.

20. 8. 2007 10:13

h4X0r (neregistrovaný)
oh, děkuji, to je milé od vás:-}
Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

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

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

DigiZone.cz: Flix TV: dva set-top boxy za korunu

Flix TV: dva set-top boxy za korunu

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

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

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

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru