【问题标题】:Packaging a read-only data file with a Ruby gem使用 Ruby gem 打包只读数据文件
【发布时间】:2011-05-25 17:39:55
【问题描述】:

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

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

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

感谢您的帮助

【问题讨论】:

    标签: ruby rubygems constants jyaml


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我会阅读expand_path,但这听起来是个不错的提示。只是出于好奇,为什么是 lib/ ?
    • 如果它是一个配置文件,或者用户应该更新它,我可能会将它放在根目录中。我将 Gem 目录结构视为通过目录公开测试、文档、安装和 gem 代码的接口。恕我直言,这个数据文件最接近于“gem code”的类别,因此应该放在 lib/.它对其他人说“除非你在这个 gem 上编码,否则不要碰这个”。这也是我见过的其他宝石所做的。
    【解决方案2】:

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

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

    【讨论】:

    • 啊,有道理!我想我从来没有把它们放在一起。非常感谢
    • 谢谢 5年了,答案还是很有帮助的。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您能否通过指向某些文档或其他受信任来源的链接来支持您的回答,该链接表明datadir 目录的目的确实是存储 静态和预定义 数据,而不是一些用户数据什么的,好吗?
    • 我在源代码中看到它:github.com/rubygems/rubygems/blob/master/lib/rubygems.rb#L360 它似乎已被弃用。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多