Ruby 使用 bundle 管理 gems 时,怎样可以加载不在 Gemfile 配置的 gem

L-codes · 2023年02月22日 · 最后由 L-codes 回复于 2023年02月23日 · 371 次阅读

场景是某些功能依赖一个 gem,但是这个功能是可选的,也就是这个 gem 的安装是可选的 但是使用了 bundle 管理 gems,则无法 require 不在 Gemfile 内的 gem

gemfile 可以加 require:false

gem "whenever", require: false
lehf 回复

😂 实测了一下 还是一样,运行的时候会提示缺少 gem

L-codes 回复

以 parallel 举例 gemfile 里添加

gem("parallel", "~> 1.19", ">= 1.19.1", require: false)

需要使用的文件头部添加

require "parallel"

rails c 里调用正常

注释头部引用之后调用失败

lehf 回复

那我不安装 parallel 还能运行吗?只要不调用 Parallel 的话

bundle 环境的话,可选依赖是必须 Gemfile 声明的。声明了你就能 require 到。不声明就不能 require,没有对应集成。

316786359 回复

需求是,Gemfile 声明了,但是允许不安装该 gem 也一样能运行,我现在就是声明了,就提示缺少依赖 gem

L-codes 回复

声明但可选安装的功能应该是 group 提供的 先用 group 声明可选安装,然后 bundle exec 的时候,如果环境变量里有 BUNDLE_WITH=对应的 group,就会确保安装并可以 require。否则可以不安装但一定不能 require

如果你是想通过 GemHome 里有不有对应插件来判断是否可以加载,bundle exec 没有这种能力。那可以 Gemfile 只做 bundle install 来保证 GemHome 有安装对应版本。然后直接运行脚本不要在 bundle exec 环境里跑。不过这种方式没有 Gemfile.lock 锁定版本的功能

316786359 回复

对 我查看了 bundle 的文档,后发现 group optional 可以实现该需求 😀

我最终项目用了 install_if 实现了,感觉这样透明一点,谢谢各位师傅的热心回答😄 https://github.com/L-codes/pwcrack-framework/blob/eeb90faf56105ad68b14ccb95db275e55542f039/Gemfile#L14

L-codes 关闭了讨论。 02月23日 22:52
需要 登录 后方可回复, 如果你还没有账号请 注册新账号