【问题标题】:Bundler.setup messes with the load pathBundler.setup 与加载路径混淆
【发布时间】:2014-09-14 05:46:09
【问题描述】:

我的库使用动态加载库的 Gem。例如,如果我选择一个 sqlite 适配器,它会加载“sqlite3”。

问题是,如果我写在我的图书馆里

require 'bundler'
Bundler.setup

它不再看到使用 ruby​​gems 安装的 gem,只看到使用 Bundler 为这个特定库安装的那些。因此

require 'sqlite3'

导致异常:

`require': LoadError: cannot load such file -- sqlite3

有没有办法在不将 sqlite3 添加到我自己的 Gemfile 中的情况下解决这个问题?

我应该指出,这个问题似乎与 sqlite3 无关,而是与 Bundler 行为有关。选择 sqlite3 仅仅是因为它是我需要的 gem,它帮助我发现了这个问题。

【问题讨论】:

  • 这就是 bundler 的重点——使用的 gem 集是由 Gemfile/Gemfile.lock 指定的完整的

标签: ruby rubygems bundler load-path


【解决方案1】:

当您使用 Bundler.setup 时,它会显式更改您的加载路径,因此您只能使用 Gemfile 中指定的 gem。这是一种理想的行为,可确保您不使用未在 Gemfile 中指定的任何内容并防止意外的依赖冲突。

当动态加载 gem 时,你应该使用 require false 选项:

gem "sqlite3", :require => false

这将导致 bundler 安装 sqlite3,但仅在需要时才需要它。

Bundler Gemfile manual

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 2017-07-17
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2013-05-10
    相关资源
    最近更新 更多