使用Ruby gem打包只读数据文件

时间:2011-05-25 17:39:55

标签: ruby rubygems constants jyaml

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

对于一些小背景,此应用程序处理包含数百个常量值的MIDI规范。例如,控制器“通道音量”始终由值7标识。“维持”由64等标识等...过去,人们已将这些值作为一组大量的常量包含在其代码中。这很好,但似乎更适合用语言无关的格式包括yaml

使用GEM_PATH定位yaml文件很难看,在非gem部署中使用库时也无法使用。

感谢您的帮助

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:6)

这些文件有指定的位置。

  1. 在您的gem中创建名为<gemdir>/data的文件夹
  2. 使用Gem.datadir方法找到此目录。
  3. 这似乎创建了一个预期公开的目录。

    如果您希望此文件是私有的,那么使用File.dirname(__FILE__) + "/path"技巧将实现这一目标。

答案 3 :(得分:0)

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