Freitag, 12. August 2011

RubyGems selber bauen

RubyGems
ist das offizielle Software-Paketsystem für die Programmiersprache Ruby.

Ein RubyGem kann nicht nur Bibliotheken, sondern auch (Kommandozeilen-) Programme, Rails-Plugins etc. pp. enthalten. RubyGems erlaubt dem Benutzer die gleichzeitige Installation eines Gems in verschiedenen Versionen.

Ein Gem-Autor kann für sein Gem Abhängigkeiten zu anderen Gems definieren, die von RubyGems bei der Installation automatisch aufgelöst werden.

Ein RubyGem selber zu bauen und veröffentlichen ist gar nicht schwer. In diesem Artikel werde ich zeigen, wie man ein RubyGem von Grund auf selbst baut und sowohl im Quellcode als auch als Paket veröffentlicht.

Im Inneren eines Gems

Ein Gem besteht aus mindestens zwei Teilen

  1. dem eigentlichen Programmcode und
  2. einer Gemspec-Datei

Zweckmäßigerweise beinhaltet ein Gem darüber hinaus noch:

  • Tests
  • Dokumentation
  • Automatisierung für die Tests und das Bauen des Pakets

Hier ein Beispiel für die Datei-Struktur eines Gems aus dem RubyGems
Guide
:

$ tree freewill
freewill/
|-- bin/
| `-- freewill
|-- lib/
| `-- freewill.rb
|-- test/
| `-- test_freewill.rb
|-- README
|-- Rakefile
`-- freewill.gemspec
Das Gem-Kommando

Die RubyGems-Installation bring das Kommandozeilen-Programm gem mit. Mit diesem Programm werden Gems verwaltet (installiert, deinstalliert, aufgelistet usw.). Das gem-Programm dient auch dazu Gems aus dem Quellcode zu bauen:

   $ gem build hola.gemspec

Successfully built RubyGem
Name: hola
Version: 0.0.0
File: hola-0.0.0.gem

Mit dem Gem-Kommando build wird die Gem-Datei erzeugt. Hierfür liest das Gem-Programm die erforderlichen Angaben aus der Gemspec-Datei.

In dem Beispiel finden wir das fertige Gem in der Datei hola-0.0.0.gem. Mit

   gem install hola-0.0.0.gem

kann man das Gem lokal installieren.

RubyGems können auf im Netz veröffentlicht und mit dem Gem-Kommando
von remote installiert werden. Näheres dazu den Abschnitt RubyGems
Dot Org
unten.


Die Gemspec-Datei

Das Herz eines Gems ist die Gemspec-Datei.

Hier wieder ein Beispiel aus dem RubyGems Guide:

Gem::Specification.new do |s|
s.name = 'hola'
s.version = '0.0.0'
s.date = '2010-04-28'
s.summary = "Hola!"
s.description = "A simple hello world gem"
s.authors = ["Nick Quaranto"]
s.email = 'nick@quaran.to'
s.files = ["lib/hola.rb"]
s.homepage = 'http://rubygems.org/gems/hola'
end
Die Gemspec-Datei enthält allgemeine Informationen über das Gem und beschreibt dessen Inhalt. Eine vollständige Liste aller Attribute findet man hier.
Die meisten Attribute sind optional. Erforderlich sind date, name, summary und version.

Optional aber dennoch wichtig ist das Attribut files. Es entscheidet, welche Dateien ins Gem kommen -- und welche nicht. Das ist deshalb wichtig, weil wir sonst Dateien mit ins Gem packen (zum Beispiel Repository-Dateien .git, .svn etc.), die da nicht hineingehören. Wer seinen Gem-Quellcode in git verwaltet, kann einfach

    s.files = `git ls-files`.split($/)

schreiben. Das packt dann alle Dateien ins Gem, die im Repository gehalten werden.

Komplexere Gems basieren möglicherweise auf anderen Gems. Um bei der Installation des Gem automatisch dafür zu sorgen, dass Abhängigkeiten aufgelöst und benötigte Gems gleich mit installiert werden, muss man nur mit z.B.

   s.add_dependency('log4r', '>= 1.0.5')

entsprechende Abhängigkeiten definieren.

RubyGems Dot Org

Wir haben ein RubyGem gebaut, die Gemspec-Datei geschrieben und können nun das Gem bauen und lokal installieren. Jetzt möchten wir das Gem veröffentlichen, so dass jeder im Netz es mit

    $ gem list -r

finden und mit

    $ gem install 

installieren kann.

Alles was man dafür braucht ist ein kostenloses Konto auf rubygems.org. Dann kann man dort sein Gem veröffentlichen:

$ gem push <gem-datei>

Don't have an account yet? Create one at http://rubygems.org/sign_up
Email: ...
Password:
Pushing gem to https://rubygems.org...
Successfully registered gem: ...

Kommentare:

  1. Ehrlich gesagt, ich glaube nicht wirklich an solche Art von Bonusprogrammen, weil es nicht immer gut funktioniert. Normalerweise ziehe ich es vor, Zeit getestete Dienstleistungen zu nutzen, die jeden Tag helfen, zum Beispiel ein paar Tage dank der Wiederherstellungssoftware konnte ich viele wichtige Dateien wiederherstellen, Sehe es hier. Sie können es auch versuchen.

    AntwortenLöschen