Bundler:为什么它会在需要“bundler / setup”上读取gemspec?

时间:2012-01-27 03:28:54

标签: ruby bundler

标题是问题,这是提示它的背景。

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)

非常感谢任何见解。

1 个答案:

答案 0 :(得分:3)

无论何时运行bundler,它都必须解析Gemfile以实际确定需要加载哪些gem,必须添加到$LOAD_PATH的内容等等。作为其中的一部分,它必须解析gemspec

Gemfile.lock包含所有gem的信息以及保存启动时间的依赖关系,但它并没有减轻它解析Gemfile的需要。

有各种方法可以解决它。两个简单的方法是使用File.read和一些正则表达式来提取版本。或者需要gem_name.rb和gem_name / version.rb文件。