2010-06-27 4 views
9

Ich arbeite an einem Ruby-Juwel, das konfigurierbare "Vorlagen" verwendet, um HTML zu generieren. Ich möchte einen Basissatz von Vorlagen mit dem Juwel hinzufügen und den Benutzern erlauben, sie mit besseren/mehr benutzerdefinierten zu überschreiben. Diese Vorlagen sind kein Ruby-Code, sie sind "nur Dateien", die irgendwann im Code von der Festplatte gelesen werden müssen.Wie man Datendateien in ein Ruby Gem einbindet?

Ich habe mir die RubyGems-Dokumentation angeschaut, aber sie machen die (nicht ganz unvernünftige) Annahme, dass ein Juwel nur Code enthält (OK, mit einigen Dokumenten und speziellen Metadaten-Dateien für ein gutes Maß). Es gibt keinen Hinweis darauf, wie das Äquivalent von "/ usr/share/..." -Dateien erstellt wird.

Was ist die beste Vorgehensweise für die Aufnahme solcher Dateien in den Edelstein? Soll ich sie einfach in die "Quellen" aufnehmen? Wenn ja, wie finde ich ihren Pfad, damit ich sie von der Diskette in den Vorlagenprozessor lesen kann?

Antwort

10

Angenommen, Sie eine Projektstruktur wie dieses:

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

In lib/foobar/teplates Verzeichnis Sie Ihre Vorlage Verzeichnisse oder Dateien.

lib/foobar/meta.rb Datei enthält den Namen Ihres Projekts und seine Version. Es ist wichtig, sie (insbesondere eine Versionsnummer) synchronisiert mit dem Namen & die Version des Projekts in Ihrem Edelstein Spezifikation. (Der beste Weg, dies zu tun ist meta.rb von Rakefile lesen Werte der Spezifikation zu übergeben.)

Zum Beispiel kann meta.rb wie folgt aussehen:

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

Dann eine Funktion schreiben, die einen vollständigen Pfad zurück zum Das lib Verzeichnis unabhängig davon, ob Sie Ihr Projekt aus den Quellen Verzeichnis testen oder das Projekt von den Rubygems installiert ist.

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 

Mit Foobar::Utils.gem_libdir Funktion können Sie immer Ihre Vorlagen in bin/foobar Datei lesen können:

require_relative '../lib/foobar/utils' 

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