【问题标题】:Make config available through an entire ruby gem通过整个 ruby​​ gem 使配置可用
【发布时间】:2013-08-13 16:59:30
【问题描述】:

我正在创建一个 gem,我想在其中定义一些可用的常量。

在我实际的gemspec 中,我添加了以下内容:

config = File.expand_path('../config', __FILE__)
$LOAD_PATH.unshift(config) unless $LOAD_PATH.include?(config)

require 'constants.rb'

constants.rb 我定义了一个简单的变量:$FOO = "Hello, World!"

然后在我的lib/gem_name/core.rb 中,我正在尝试puts $FOO,但它似乎不可用。没有错误,只是出现空白。我不了解 gem 依赖项和 require 树在这里的工作原理吗?

** 更新 **

我还尝试直接在 lib 下添加一个 config 目录,该目录已经在 LOAD_PATH 中。然后在我的库中,我试图require config/constants,但这就是说它无法加载这样的文件。

我也尝试直接将constants.rb 移动到 lib 目录并要求这样做,它警告我它无法加载此类文件。有什么东西很不靠谱。

【问题讨论】:

  • 不要修改$LOAD_PATH

标签: ruby rubygems gemspecs


【解决方案1】:

根据Katz

当您的 gem 构建完成时,Rubygems 将运行该代码并创建一个静态表示。这意味着可以从库本身中提取 gem 的版本或其他共享详细信息。但是,不要使用其他库或依赖项。

这意味着在构建 gem 时会运行 require 'constants.rb'$LOAD_PATH.unshift(...) 等。在运行时,它不会更改 $LOAD_PATH 或导致全局要求。在运行时改用gem.require_paths 修改$LOAD_PATH

例如,在您的 gemspec 中,使用

gem.files += Dir['config/**/*']
gem.require_paths = %w[lib config]

然后在需要$FOO的地方,使用

require 'constants'

附注

  • 在使用require 时,您不需要包含.rb 扩展名。
  • 确保您需要的所有文件都在gem.files 中。

【讨论】:

  • 嗨,吉姆,感谢您的回复。在我们说话的时候,我实际上正在尝试这样做,当我安装 gem 时,我得到以下信息:file 'config' not found 由于某种原因,它不喜欢 gem.require_path 中的那个选项。
  • 糟糕。它应该是require_paths,带有一个's'。
  • require_paths 指令也一样。没有骰子。
  • 啊,我发现了问题所在。我还没有git add 目录/文件,而 gem.files 正在使用 git 来查看哪些文件是带有 git ls-files 的 gem 的一部分,再次感谢您
  • Np。很高兴你修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多