2011-12-20 9 views
7

Estoy trabajando en mi primera gema (bastante nueva para ruby ​​también), el código completo hasta el momento está aquí;Usando archivos yaml dentro de gemas

https://github.com/mikeyhogarth/tablecloth

Una cosa que he tratado de hacer es crear un archivo YAML, que la gema puede acceder como una búsqueda (en lib/mantel/yaml/qty.yaml). Todo esto funciona muy bien y la unidad prueba todos los pasos, sin embargo, cuando construyo e instalo la gema y trato de ejecutar bajo IRB (desde mi carpeta de inicio) lo estoy obteniendo;

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

El código ahora está buscando el archivo en ~/lib/mantel ... en lugar de en el directorio de la gema está instalada a. Entonces mis preguntas son;

1) ¿Cómo debo cambiar la línea 27 de recipe.rb de manera que esté buscando en la carpeta en la que está instalada la gema?

2) ¿De hecho, me estoy acercando a todo esto incorrectamente (es incluso apropiado usar archivos estáticos yaml dentro de las gemas de esta manera)?

Respuesta

14

Bueno en primer lugar se debe remitir al archivo de la siguiente manera:

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

File.dirname(__FILE__) le da el directorio en el que el archivo actual (recipe.rb) se encuentra. File.join conecta filepaths de la manera correcta. Por lo tanto, debe usar esto para hacer referencia al archivo yaml relativo a la carpeta recipe.rb.

Si usar un archivo YAML en este caso es una buena idea, es algo que se discute ampliamente. Yo, pienso, esta es una forma adecuada, especialmente al comienzo del desarrollo con ruby.

Una alternativa válida para los archivos yaml sería un archivo rb (Ruby Code), en el que declara las constantes que contienen sus datos. Más tarde puedes usarlos directamente. De esta forma, solo el intérprete de rubí tiene que funcionar y usted ahorrará tiempo de computación para otras cosas. (no es necesario un analizador)

Sin embargo, en el escenario normal, también debe tener cuidado de no leer en un archivo YAML. Por lo que debe ser capaz de manejar que:

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 

O si no se preocupan por los detalles:

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

Gracias. A decir verdad, la única razón por la que lo hice de esta manera es porque el libro que acabo de leer sugirió que era la mejor práctica (sin números mágicos en el código, editable por no programadores, etc.), pero sí tomo su punto y lo haré probablemente cambie esto en algún momento. –

Cuestiones relacionadas