场景是某些功能依赖一个 gem,但是这个功能是可选的,也就是这个 gem 的安装是可选的
但是使用了 bundle 管理 gems,则无法 require
不在 Gemfile 内的 gem
以 parallel 举例 gemfile 里添加
gem("parallel", "~> 1.19", ">= 1.19.1", require: false)
需要使用的文件头部添加
require "parallel"
rails c 里调用正常
注释头部引用之后调用失败
声明但可选安装的功能应该是 group 提供的 先用 group 声明可选安装,然后 bundle exec 的时候,如果环境变量里有 BUNDLE_WITH=对应的 group,就会确保安装并可以 require。否则可以不安装但一定不能 require
如果你是想通过 GemHome 里有不有对应插件来判断是否可以加载,bundle exec 没有这种能力。那可以 Gemfile 只做 bundle install 来保证 GemHome 有安装对应版本。然后直接运行脚本不要在 bundle exec 环境里跑。不过这种方式没有 Gemfile.lock 锁定版本的功能
我最终项目用了 install_if
实现了,感觉这样透明一点,谢谢各位师傅的热心回答
https://github.com/L-codes/pwcrack-framework/blob/eeb90faf56105ad68b14ccb95db275e55542f039/Gemfile#L14