Dopo averne compreso le enormi potenzialità vediamo come creare un pacchetto gem contente una nostra libreria. Innanzitutto i sorgenti e tutti i file accessori vanno disposti in una struttura coerente. Ad esempio nella directory radice possiamo creare le seguenti directory:
lib/
contiene le applicazioni, e le librerie, Ruby vere e proprie
ext/
contiene eventuali estensioni Ruby scritte in C
bin/
contiene gli script necessari in fase di installazione
data/
contiene i file dati che accompagnano l'applicazione
conf/
contiene tutti i file di configurazione
man/
contiene le pagine del manuale
test/
contiene i test
Il primo passo consiste nel creare un file di specifica gemspec
che conterrà una serie di metadati utilizzati da gem per svolgere le sue operazioni. Un esempio è il seguente:
require 'rubygems' SPEC = Gem::Specification.new do |spec| spec.name = "ProvaGem" spec.version = "1.0.0" spec.author = "Foo Bar" spec.email = "foo@bar.net" spec.homepage = "http://qualchesito.net/ProvaGem" spec.platform = Gem::Platform::RUBY spec.summary = "Qui ci va una breve descrizione" candidates = Dir.glob("{bin, lib, test}/**/*") spec.files = candidates.delete_if do |item| item.include?("CVS") || item.include?("rdoc") end spec.test_file = "test/ts_prova.rb" spec.has_rdoc = true spec.require_path = "lib" spec.extra_rdoc_files = ["README", "ChangeLog"] spec.add_dependency "QualcheLibreria", ">=1.0" end
Commentiamo questo codice. All'inizio ci sono alcune informazioni relative al pacchetto e all'autore. Segue poi platform che indica il tipo di piattaforma dove può essere installata la gemma, ad esempio Gem::Platform::Ruby se si tratta di puro Ruby, Gem::Platform::Win32 per applicazioni Windows e così via.
Scegliamo quindi i file da includere attraverso
candidates = Dir.glob("{bin, lib, test}/**/*") spec.files = candidates.delete_if do |item| item.include?("CVS") || item.include?("rdoc") end
pescandoli nelle directory bin, lib e test ed escludendo i file relativi al repository e la documentazione rdoc. In alternativa, in modo più semplice, avremmo potuto scrivere qualcosa tipo
spec.files = Dir['lib/**/*.rb'] + Dir['bin/*']
raccattando tutto quello presente nelle directory lib e bin. E per escludere alcuni tipi di file l'alternativa è:
spec.files.reject! { |f| f.include? "RDoc" }
Seguono poi altre opzioni che riguardano i test, la documentazione e le dipendenze. L'elenco completo è visualizzabile sull'homepage del progetto.
Fatto questo non ci resta che salvare il file, ad esempio come Provagem.gemspec, ed eseguire gem col comando build
:
$ gem build ProvaGem.gemspec Successfully built RubyGem Name: ProvaGem Version: 1.0.0 File: ProvaGem-1.0.0.gem
Dopo questo comando nella directory corrente troveremo un pacchetto gem contenente tutto quello che serve per l'installazione della nostra libreria.