2011-12-20 47 views
7

我只是在研究我的第一个宝石(对于ruby来说也很新颖),到目前为止的整个代码都在这里;在宝石中使用yaml文件

https://github.com/mikeyhogarth/tablecloth

有一件事我一直试图做的是创造出宝石可以作为查找访问(位于lib /桌布/ YAML/qty.yaml)YAML文件。这一切都很好,单元测试全部通过,但是当我构建和安装gem并尝试在irb下运行(从我的home文件夹)时,我正在获得;

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

代码现在正在寻找〜/ lib/tablecloth中的文件...而不是在gem安装到的目录中。所以我的问题是;

1)我应该如何更改recipe.rb的第27行,以便它在安装了gem的文件夹中查找?

2)我是否实际上错误地处理了这件事(是否适合在这种方式下使用gem中的静态yaml文件)?

回答

14

那么首先你应该参考该文件在以下方式:

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

File.dirname(__FILE__)让你在当前文件(recipe.rb)所在的目录。 File.join以正确的方式连接文件路径。所以你应该使用它来将yaml文件相对引用到recipe.rb文件夹。

如果在这种情况下使用YAML文件是一个好主意,这是一个广泛讨论的问题。我自己认为,这是一个适当的方式,特别是在用红宝石开发的时候。

yaml-files的一个有效替代方案是rb-File(Ruby Code),其中声明了包含数据的常量。稍后您可以直接使用它们。通过这种方式,只有ruby解释器必须工作,并且可以为其他事情节省计算时间。 (不需要解析器)

但是,在正常情况下,您还应该注意,读取YAML文件可能会失败。所以,你应该能够处理:

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 

或者,如果你不关心细节:

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

谢谢。说实话,我这样做的唯一原因是因为我刚刚读完的这本书表明这是最佳实践(代码中没有神奇数字,非程序员可编辑等),但我确实遵循了你的观点,并会可能会在某些时候改变这一点。 – 2011-12-20 09:38:57