我正在创建一个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目录并要求它,并且它警告我它无法加载这样的文件。有些东西非常糟糕。
答案 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
。