【问题标题】:Bundler: why does it read the gemspec on require "bundler/setup"?Bundler:为什么它会在 require “bundler/setup” 上读取 gemspec?
【发布时间】:2012-01-27 03:28:54
【问题描述】:

标题就是问题,这里是提示它的上下文。

宝石文件:

source "http://rubygems.org"

# Specify your gem's dependencies in the gemspec
gemspec

这是机架文件的顶部:

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 的依赖项。当通过 bundler 需要 gem 库时,它显然也会运行 gemspec。我可以很容易地“修复”它,我在 gemspec 中手动定义了版本号。

回到我的问题 - 为什么 Bundler 需要在库的运行时查看 gemspec?

捆绑器 (1.0.21)

非常感谢任何见解。

【问题讨论】:

    标签: ruby bundler


    【解决方案1】:

    每当您运行 bundler 时,它必须解析 Gemfile 以实际确定需要加载哪些 gem,必须将哪些添加到 $LOAD_PATH 等等。作为其中的一部分,它必须解析gemspec。

    Gemfile.lock 包含所有 gem 的信息以及依赖项以节省启动时间,但它并不能减轻它解析 Gemfile 的需要。

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

    【讨论】:

    • 感谢您的回复。我找到了这个yehudakatz.com/2010/12/16/…(在你回答之后),它也解释了为什么和为什么,但我认为这是一个奇怪的论点,因为“Gemfile 不包含元数据、包中的文件列表、包公开的可执行文件,或应该放在加载路径上的目录。那些东西不在捆绑器的范围内。这不是我的经验,尤其是当您收到诸如require "bundler/setup" 之类的命令时。再次感谢您的回复和提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2014-03-27
    • 2018-09-25
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多