标题是问题,这是提示它的背景。
Gemfile:
source "http://rubygems.org"
# Specify your gem's dependencies in the gemspec
gemspec
以下是rackup文件的顶部:
require 'rubygems'
require "bundler/setup"
在运行rackup文件时会抛出错误:
<module:Rack>': GemName is not a class (TypeError)
为什么呢?因为我正在编写一个Rack中间件,标准布局是:
lib/
rack/
gem_name.rb
gem_name/
version.rb
gem_name.rb将包含:
module Rack
class GemName
version.rb将包含:
module Rack
module GemName
VERSION = "0.0.1"
最后,gem_name.gemspec将包含:
require "rack/flash-in-the-pan/version"
#...
s.version = Rack::GemName::VERSION
只要您不同时需要这两个文件,就可以使用相同的名称命名模块和类。 通常,这个不会发生,因为您需要构建gem的版本,或者您需要运行gem库,只需要一个或其他。
但是,这次我决定使用Bundler来管理gem的依赖。当通过捆绑器需要gem库时,它显然也运行gemspec。我可以很容易地“修复”它,我在gemspec中手动定义了版本号。
回到我的问题 - 为什么Bundler需要在库的运行时查看gemspec?
bundler(1.0.21)
非常感谢任何见解。
答案 0 :(得分:3)
无论何时运行bundler,它都必须解析Gemfile以实际确定需要加载哪些gem,必须添加到$LOAD_PATH
的内容等等。作为其中的一部分,它必须解析gemspec
。
Gemfile.lock包含所有gem的信息以及保存启动时间的依赖关系,但它并没有减轻它解析Gemfile的需要。
有各种方法可以解决它。两个简单的方法是使用File.read
和一些正则表达式来提取版本。或者需要gem_name.rb和gem_name / version.rb文件。