2010-06-27 14 views
9

Sto lavorando su una gemma di Ruby che utilizza dei "modelli" configurabili per generare codice HTML. Voglio includere un set base di modelli con la gemma, e consentire agli utenti di li modifichi con quelli meglio/più personalizzati. Questi modelli non sono codice Ruby, sono "solo file" che devono essere letti dal disco in qualche punto del codice.Come includere i file di dati in un rubino Gem?

Ho esaminato la documentazione di RubyGems ma fanno l'ipotesi (non del tutto irragionevole) che una gemma contenga solo il codice (OK, con una certa documentazione e specifici file di meta-dati inseriti per buona misura). Non c'è alcun riferimento a come creare l'equivalente di file "/ usr/share/...".

Qual è la migliore pratica per includere tali file nella gemma? Dovrei semplicemente includerli come parte delle "fonti"? In tal caso, come faccio a scoprire il loro percorso in modo che io possa leggerli dal disco nel processore di template?

risposta

10

Supponiamo di avere una struttura di progetto come questo:

bin/ 
|__ foobar* 
lib/ 
|__ foobar/ 
| |__ templates/ 
| | |__ a/ 
| | |__ b/ 
|___|__ meta.rb 
|___|__ utils.rb 

In lib/foobar/teplates directory avete le vostre cartelle dei modelli o file.

lib/foobar/meta.rb Il file contiene il nome del progetto e la sua versione . E 'importante per tenerli (in particolare un numero di versione) sincronizzati con il nome & la versione del progetto nella vostra specifica gemma . (Il modo migliore per farlo è letto meta.rb da Rakefile per passare i valori per le specifiche.)

Per esempio, meta.rb può apparire come:

module Foobar 
    module Meta 
    NAME = 'foobar' 
    VERSION = '0.1.2' 
    end 
end 

quindi scrivere una funzione che restituisce un percorso completo il lib directory indipendentemente dal fatto che si sta testando il progetto dalle fonti directory o il progetto viene installato dal RubyGems.

utils.rb:

require_relative 'meta' 

module Foobar 
    module Utils 

    # Return a directory with the project libraries. 
    def self.gem_libdir 
     t = ["#{File.dirname(File.expand_path($0))}/../lib/#{Meta::NAME}", 
      "#{Gem.dir}/gems/#{Meta::NAME}-#{Meta::VERSION}/lib/#{Meta::NAME}"] 
     t.each {|i| return i if File.readable?(i) } 
     raise "both paths are invalid: #{t}" 
    end 

    # [...] 
    end 
end 

Avere Foobar::Utils.gem_libdir funzione si può sempre leggere i modelli in bin/foobar di file:

require_relative '../lib/foobar/utils' 

puts Dir[Foobar::Utils.gem_libdir + '/*'] 
puts Foobar::Utils.gem_libdir + '/templates/a/blah-blah' 
Problemi correlati