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