Bundler.setup与加载路径发生冲突



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

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

require 'bundler'
Bundler.setup

它不再看到使用rubygems安装的gems,而只看到使用Bundler为该特定lib安装的gem。因此

require 'sqlite3'

导致异常:

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

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

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

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

当动态加载gems时,您应该使用require-false选项:

gem "sqlite3", :require => false

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

参见Bundler Gemfile手册

最新更新