为什么Bundler不使用系统gem?如何配置使其复用系统已安装的gem
Bundler 无法复用系统路径已安装Gem的解决方案
可能的问题原因
- 项目本地
.bundle/config中配置了BUNDLE_PATH: "vendor/bundle":该配置会让Bundler默认优先将Gem安装到项目本地的vendor/bundle目录,跳过系统GEM路径的检测,哪怕移除了BUNDLE_DISABLE_SHARED_GEMS配置也不会主动读取系统Gem - 全局Bundler配置残留:如果全局
~/.bundle/config中也配置了BUNDLE_PATH或BUNDLE_DISABLE_SHARED_GEMS,会覆盖项目局部配置的效果 - 老版本Bundler的配置缓存问题:1.15.x版本的Bundler存在配置缓存逻辑,修改配置后如果没有清理旧的本地Gem缓存,会沿用之前的安装逻辑
- 曾执行过
bundle install --deployment:部署模式会强制锁定本地Gem路径,禁用系统Gem复用,且配置会被持久化到.bundle/config中
修复步骤
- 清理冗余配置
- 删除项目
.bundle/config中的BUNDLE_PATH、BUNDLE_DISABLE_SHARED_GEMS配置项,仅保留需要的BUNDLE_BIN: "vendor/bin"即可,也可直接删除整个.bundle目录做干净测试 - 检查全局
~/.bundle/config文件,删除其中的BUNDLE_PATH、BUNDLE_DISABLE_SHARED_GEMS相关配置
- 删除项目
- 开启系统Gem优先配置
执行以下命令开启项目局部的系统Gem优先配置:
该配置会明确告诉Bundler优先读取系统GEM路径下已安装的Gem,不会强制安装到项目本地目录bundle config set --local path.system true - 清理历史缓存
删除项目下之前生成的本地Gem缓存目录:rm -rf vendor/bundle - 验证效果
重新执行bundle install,即可看到Using提示,直接复用/var/lib/gems/2.3.0路径下已安装的Gem
临时验证方案
如果需要快速测试效果,可直接执行带参数的安装命令,跳过持久化配置:
bundle install --system
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

