2

我正在创建一个 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 树在这里是如何工作的吗?

** 更新 **

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

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

4

1 回答 1

3

根据卡茨的说法,

当您的 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'

旁注

  • 使用时不需要包含.rb扩展名require
  • 确保您需要的所有文件都在gem.files.
于 2013-08-13T17:20:45.917 回答