通过整个ruby gem提供配置

时间:2013-08-13 16:59:31

标签: ruby rubygems gemspecs

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

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

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

require 'constants.rb'

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

然后在我的lib/gem_name/core.rb中,我正在尝试puts $FOO,但它似乎无法使用。没有错误,只是空白。我不明白gem依赖关系和require树是如何工作的吗?

**更新**

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

我也试过直接将constants.rb移动到lib目录并要求它,并且它警告我它无法加载这样的文件。有些东西非常糟糕。

1 个答案:

答案 0 :(得分:3)

根据Katz

  

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

这意味着在构建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'

附注

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