2011-12-20 10 views
7

Sto solo lavorando alla mia prima gemma (piuttosto nuova a Ruby), l'intero codice finora è qui;Utilizzo di file yaml nelle gemme

https://github.com/mikeyhogarth/tablecloth

Una cosa che ho cercato di fare è quello di creare un file YAML, che la gemma può accedere come una ricerca (in lib/tovaglia/yaml/qty.yaml). Tutto funziona alla grande e tutti i test di unità passano, quando creo e installo la gem e provo a girare sotto irb (dalla mia cartella home) che sto ottenendo;

Errno::ENOENT: No such file or directory - lib/tablecloth/yaml/qty.yaml 

Il codice è ora alla ricerca per il file in ~/lib/tovaglia ... piuttosto che nella directory la gemma è installato. Quindi le mie domande sono;

1) Come dovrei cambiare la riga 27 di recipe.rb in modo che stia cercando nella cartella in cui è installato il gem?

2) In effetti, mi sto avvicinando in modo errato a questa cosa (è addirittura appropriato utilizzare i file statici di yaml all'interno delle gemme in questo modo)?

risposta

14

Ben prima di tutto si dovrebbe fare riferimento al file nel modo seguente:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
units_hash = YAML.load_file(filepath) 

File.dirname(__FILE__) ti dà la directory in cui si trova il file corrente (recipe.rb). File.join collega i percorsi di file nel modo giusto. Quindi dovresti usare questo per fare riferimento al file yaml relativo alla cartella recipe.rb.

Se l'uso di un file YAML in questo caso è una buona idea, è qualcosa che è ampiamente discusso. Io, penso, questo è un modo adeguato, specialmente all'inizio dello sviluppo con il rubino.

Un'alternativa valida ai file yaml potrebbe essere un file rb (Ruby Code) in cui si dichiarano le costanti che contengono i dati. In seguito puoi usarli direttamente. In questo modo solo l'interprete di ruby ​​deve funzionare e si risparmia tempo di calcolo per altre cose. (non è necessario il parser)

Tuttavia, nel normale scenario si dovrebbe anche fare attenzione che la lettura in un file YAML possa fallire. Così si dovrebbe essere in grado di gestire questo:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
begin 
    units_hash = YAML.load_file(filepath) 
rescue Psych::SyntaxError 
    $stderr.puts "Invalid yaml-file found, at #{file_path}" 
    exit 1 
rescue Errno::EACCES 
    $stderr.puts "Couldn't access file due to permissions at #{file_path}" 
    exit 1 
rescue Errno::ENOENT 
    $stderr.puts "Couldn't access non-existent file #{file_path}" 
    exit 1 
end 

Oppure, se non si cura dei dettagli:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml") 
units_hash =  
    begin 
    YAML.load_file(filepath) 
    rescue Psych::SyntaxError, Errno::EACCES, Errno::ENOENT 
    {} 
    end 
+1

Grazie. A dire il vero, l'unica ragione per cui l'ho fatto in questo modo è perché il libro che ho appena letto suggeriva che era la migliore pratica (nessun numero magico nel codice, modificabile dai non programmatori, ecc.) Ma io prendo il tuo punto e probabilmente cambi questo a un certo punto. –