我的库使用动态加载库的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手册