2012-04-12 23 views
17

C'è un modo per conoscere il percorso radice della mia gemma? Sto provando a caricare una configurazione di default da un yaml all'interno del percorso delle gemme. Come ottengo la directory radice gems con ruby?Trovare la gemma radice

risposta

26

Data la seguente struttura del progetto:

your_gem/ 
    lib/ 
    your_gem.rb 

Ecco come lo farei:

# your_gem.rb 

module YourGem 
    def self.root 
    File.expand_path '../..', __FILE__ 
    end 
end 

Ruby 2.0 ha introdotto il metodo Kernel#__dir__; consente una soluzione notevolmente più breve:

# your_gem.rb 

module YourGem 
    def self.root 
    File.dirname __dir__ 
    end 
end 

Se è necessario accedere alle altre directory, si può semplicemente costruire su root:

module YourGem 
    def self.bin 
    File.join root, 'bin' 
    end 

    def self.lib 
    File.join root, 'lib' 
    end 
end 
+0

Ha lavorato per me per referenziare la mia cartella "docs" inclusa come parte della gemspec, dove l'utilizzo del file Rails.root.join ("docs") predefinito fallisce. Grazie! –

+0

Sto usando ruby ​​2.0.0p0 (2013-02-24 revisione 39474). 'File.dirname __dir__' non funziona per me. Ottengo questo errore: 'TypeError: nessuna conversione implicita di nil in String'. Capita di sapere perché? Grazie. –

+0

@ EE33, ['__dir__' è documentato per restituire' nil' se '__FILE__' è anche' nil'] (http://www.ruby-doc.org/core-2.0.0/Kernel.html#method -i -__ dir__). Come stai gestendo la tua sceneggiatura? –

6

gem list <gem> -d

Oppure, se si sta utilizzando bundler:

bundle show <gem>

+0

All'interno della gemma stessa: sto cercando di chiamare File.load. Qual è la gemma radice? –

25

Questa è una soluzione universale per gli eseguibili e le librerie. Carica la specifica utilizzando l'API Gem, quindi il percorso è sempre corretto:

spec = Gem::Specification.find_by_name("your_gem_name") 
gem_root = spec.gem_dir 
yaml_obj = YAML.load(gem_root + "/file_name.yaml") 
+2

Utilizzare ['File.join'] (http://www.ruby-doc.org/core-2.1 .1/File.html # method-c-join) invece della concatenazione di stringhe –

+0

@MatheusMoreira perché è importante? –

+1

'File.join' garantisce l'utilizzo del separatore di percorso appropriato per il sistema operativo che rende il codice cross-platorm . "/" è specifico per Linux. Molte versioni (tutte?) di Microsoft Windows usano "\". –

Problemi correlati