Ruby 在gems中使用yaml文件

Ruby 在gems中使用yaml文件,ruby,gem,yaml,Ruby,Gem,Yaml,我正在开发我的第一个gem(对于ruby来说也是非常新的),到目前为止,完整的代码都在这里 我尝试做的一件事是创建一个yaml文件,gem可以通过查找访问该文件(在lib/tablecloth/yaml/qty.yaml下)。这一切都很好,单元测试都通过了,无论我构建和安装gem,并尝试在我得到的irb(从我的主文件夹)下运行 Errno::ENOENT: No such file or directory - lib/tablecloth/yaml/qty.yaml 代码现在正在~/lib

我正在开发我的第一个gem(对于ruby来说也是非常新的),到目前为止,完整的代码都在这里

我尝试做的一件事是创建一个yaml文件,gem可以通过查找访问该文件(在lib/tablecloth/yaml/qty.yaml下)。这一切都很好,单元测试都通过了,无论我构建和安装gem,并尝试在我得到的irb(从我的主文件夹)下运行

Errno::ENOENT: No such file or directory - lib/tablecloth/yaml/qty.yaml
代码现在正在~/lib/tablecloth中查找文件。。。而不是在安装gem的目录中。所以我的问题是,

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


2) 事实上,我是不是在错误地处理这整件事(这样在gems中使用静态yaml文件是否合适)?

首先,您应该以以下方式引用该文件:

file_path = File.join(File.dirname(__FILE__),"yaml/qty.yaml")
units_hash = YAML.load_file(filepath)
File.dirname(\uuuu File\uuuu)
提供当前文件(recipe.rb)所在的目录。
File.join
以正确的方式连接文件路径。因此,您应该使用它来引用相对于recipe.rb文件夹的yaml文件

如果在本例中使用YAML文件是一个好主意,这是一个被广泛讨论的问题。一、 我自己认为,这是一种适当的方法,尤其是在使用ruby开发的初期

yaml文件的有效替代方法是rb文件(Ruby代码),在该文件中声明包含数据的常量。以后你可以直接使用它们。这样一来,只有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

谢谢说实话,我这样做的唯一原因是因为我刚读完的那本书建议这是最佳实践(代码中没有神奇的数字,非程序员可以编辑等等),但我同意你的观点,可能会在某个时候改变这一点。