如何在未用rvm/rbenv的Rails项目中卸载全部Gem并重新bundle?
嘿,这个问题问到点子上了!确实,不用rvm/rbenv的情况下,咱们也能像Node.js删node_modules那样,安全重置Rails项目的Gem依赖,完全不用碰全局Gem目录。我平时处理这种场景常用这几个办法,给你拆解下:
1. 用bundle clean清理未被项目引用的Gem
这是最直接的官方方式,Bundle会自动识别当前项目Gemfile.lock里没有的Gem,然后从本地(包括全局)移除它们,但只会动那些当前项目用不上的Gem,不会影响其他项目的依赖。
- 先预览要删除的Gem(避免误删):
bundle clean --dry-run - 确认没问题后,执行真正的清理:
bundle clean --force - 之后重新安装依赖:
bundle install
2. 删除Gemfile.lock + 重新生成依赖
Gemfile.lock就像Node里的package-lock.json,记录了当前项目所有Gem的精确版本。删掉它再重新bundle,会让Bundle重新解析Gemfile并生成全新的依赖锁文件,相当于彻底重置版本:
- 删除锁文件:
rm Gemfile.lock - 重新安装依赖(如果想强制更新所有Gem到最新兼容版本,可以加
--update):bundle install # 或者强制更新所有Gem:bundle install --update
3. 把Gem安装到项目本地(最像node_modules的方案)
如果想完全把依赖隔离在项目内部,就像node_modules那样,你可以让Bundle把所有Gem安装到项目根目录的vendor/bundle文件夹里。这样以后要重置,直接删这个文件夹就行,完全不碰全局目录:
第一次安装时指定本地路径:
bundle install --path vendor/bundle执行后,项目里会生成
.bundle/config文件,以后再执行bundle install都会默认装到这个路径。后续重置依赖时,直接删除本地bundle目录:
rm -rf vendor/bundle rm Gemfile.lock bundle install这操作和
rm -rf node_modules && npm install简直一模一样!
小贴士:如果之前没指定过本地路径,执行
bundle install --path vendor/bundle后,全局的Gem还是会存在,但项目会优先用本地的。如果想切换回全局,只需要删除.bundle/config文件就行。
内容的提问来源于stack exchange,提问作者Huy Vo

