簡體   English   中英

在gem中使用yaml文件

[英]Using yaml files within gems

我正在研究我的第一個寶石(也是ruby的新手),到目前為止整個代碼都在這里;

https://github.com/mikeyhogarth/tablecloth

我試圖做的一件事是創建一個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)我實際上是不正確地接近這整個事情(以這種方式在gem中使用靜態yaml文件是否合適)?

首先,您應該通過以下方式引用文件:

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

File.dirname(__FILE__)為您提供當前文件(recipe.rb)所在的目錄。 File.join以正確的方式連接文件路徑。 因此,您應該使用它來引用對於recipe.rb文件夾的yaml文件。

如果在這種情況下使用YAML文件是一個好主意,那就是廣泛討論的內容。 我,我自己認為,這是一種適當的方式,特別是在開發紅寶石時。

yaml文件的有效替代方法是rb-File(Ruby代碼),您可以在其中聲明包含數據的常量。 稍后您可以直接使用它們。 這樣只有ruby-interpreter才能工作,你可以節省其他事情的計算時間。 (不需要解析器)

但是,在正常情況下,您還應該注意讀取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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM