9

我正在开发一个作为 gem 部署的 Ruby 应用程序。我想在 gem 中包含一个只读数据文件,但不确定应该如何/在哪里打包

对于一些背景知识,此应用程序处理包含数百个常量值的 MIDI 规范。例如,控制器“Channel Volume”始终由值 7 标识。“Sustain”由 64 标识。等等……过去,人们将这些值作为一大组常量包含在他们的代码中。很好,但对我来说,将它们包含在与语言无关的格式中似乎更合适,例如 yaml

使用 GEM_PATH 来定位 yaml 文件很丑陋,并且在非 gem 部署中使用该库时也不起作用。

谢谢您的帮助

4

4 回答 4

11

我不认为 RubyGems 对您应该在哪里存储这样的文件做出任何断言。我会把它放在下面lib/并像@mkrmr 说的那样做。不过,我会使用File.expand_path,因为它减少了键入并修复了符号链接和移动文件的一些偶发问题:YAML.load_file(File.expand_path('../../midi_codes.yml', __FILE__))

于 2011-05-25T23:05:24.653 回答
7

如果将此文件放在 Gem 的源代码树中的某个位置,则可以使用相对路径来加载它。从您想阅读它的地方,您可以像这样定义路径:File.dirname(__FILE__) + "/here/is/my/file.txt"

你可以使用路径修饰符 .. 就像你在 shell 上去上一个目录一样。

于 2011-05-25T19:22:03.277 回答
6

这些文件有一个指定的位置。

  1. <gemdir>/data在你的 gem 中创建一个文件夹
  2. 使用Gem.datadir方法来定位这个目录。

这似乎创建了一个预期公开的目录。

如果你希望这个文件是私有的,那么使用这个File.dirname(__FILE__) + "/path"技巧就可以做到这一点。

于 2014-10-14T14:21:17.903 回答
1

Rubygems 包管理器将其静态文件放置在lib目录中。例如,证书 ( *.pem) 存储在lib/rubygems/ssl_certs. 我相信他们可以被认为是最权威的来源,因此我建议你也这样做。

于 2017-03-28T01:29:27.817 回答