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
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
gem list <gem> -d
Oppure, se si sta utilizzando bundler:
bundle show <gem>
All'interno della gemma stessa: sto cercando di chiamare File.load. Qual è la gemma radice? –
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")
Utilizzare ['File.join'] (http://www.ruby-doc.org/core-2.1 .1/File.html # method-c-join) invece della concatenazione di stringhe –
@MatheusMoreira perché è importante? –
'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 "\". –
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! –
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. –
@ 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? –