2011-10-26 53 views
69

更新捆绑包后,您将有一些可能已过时的宝石 - 因为该宝石的新版本已安装。在bundle可执行文件中没有这样的命令,即bundle clean。人们如何摆脱这些过时的宝石?导轨捆绑清洁

这是一个尝试在我的Rails应用程序中减少弹塞大小。

回答

113

如果您使用Bundler 1.1或更高版本,则可以使用bundle clean,就像您想象的那样。如果您使用的是bundle install --path(Bundler管理您使用--path指定的位置,因此需要负责移除过期的宝石),但这是多余的,但是如果您使用Bundler将宝石安装为系统宝石,则bundle clean --force将删除任何系统您的Gemfile不需要的宝石。极其明显的警告:如果您有其他依赖系统宝石的应用程序不在您的Gemfile中,请不要这样做!

Pat Shaughnessy对bundle clean and other new additions in bundler 1.1有很好的描述。

+20

对于那些使用rvm的人,请注意'bundle clean --force'不会触及您的全局gem,但只会触及当前gemset中的那些gemset。所以'bundle clean --force'产生的结果与'rvm gemset empty'相同,结果比'bundle install'更快。 –

+15

免责声明:如果你不小心,“捆绑清洁 - 力量”可以吹走大量的宝石。这应该是这种回应的第一行......特别是因为它有这么多票。小心! – jerrylroberts

21

如果您使用RVM,您可以将您的宝石安装到gemsets。这样,当您想要执行完整清理时,您可以简单地删除gemset,然后删除安装在其中的所有gem。您的其他选择是简单地卸载未使用的宝石,然后重新运行您的bundle install命令。

由于bundler旨在成为每个项目的项目创业版本工具,因此它不提供bundle clean命令。这样做意味着可以去除与其他项目相关的宝石,这是不可取的。这意味着bundler可能是用来管理你的gem目录的错误工具。我个人的建议是使用RVM gemset来在某些项目或ruby版本中对你的宝石进行沙箱。

+40

无需取出宝石,你可以输入“RVM宝石空gemset_name”,然后运行“包安装”再。 – JAG

+0

很好的解释。知道捆绑器有帮助。谢谢。 – Volte

+9

捆绑清洁 - 力量将完成工作 – sailor

1

我假设你安装宝石到vendor/bundle?如果是这样,为什么不删除所有的宝石,并做一个干净的bundle install

+0

我的供应商目录只跟踪资产和安装的插件。我在Rails 3.1 – iGbanam

+0

那么如果在部署时没有复制它们,那么删除未使用的gem的原因是什么?他们不占用太多的空间。 –

+0

我在局域网上部署这个rails应用程序;这意味着我在本地处理文件和环境。如果您知道我可以使用的任何解决方案,请分享。 – iGbanam

0

只需从您的Gemfile中删除过时的宝石。如果你正在谈论Heroku(你没有提到这一点),那么就会使用该文件的当前内容编译每个新版本的slug。

+0

这不一定适用于heroku。我想减少rails应用程序本身的大小。 – iGbanam

10

老实说,我有捆绑器循环依赖问题,最好的方法是rm -rf .bundle。节省自己的头痛,只用锤子。

+0

其实并没有帮助我,同样的错误。 – holms

+1

我必须这样做才能让它停止关注“您必须使用--no-deployment调用bundle install”。谢谢 – Kevin

+2

感谢您的想法。虽然对我来说,使用更大的锤子有帮助。 'rvm implode --force',然后重新安装rvm – Ryan

30

如果您使用的是RVM,则可以使用rvm gemset empty作为当前gemset - 此命令将删除安装到当前gemset的所有gem(gemset本身将保留原位)。然后运行bundle install以安装宝石的实际版本。另外请确保您在rvm gemset empty期间不删除诸如rake,bundler等的一般宝石(如果是这种情况,请在bundle install之前通过gem install手动安装它们)。