如何使gem install命令仅在未安装或需要更新时安装

时间:2013-01-24 13:51:05

标签: ruby gem

我已经阅读了rubygems网站上的文档,但我想“gem install”命令总是重新安装,重新编译所有内容,即使已经安装了相同的版本..

如何使gem install命令仅在需要时安装?

3 个答案:

答案 0 :(得分:23)

看起来--conservative标志会使gem命令做你想做的事。

gem install rake --conservative

来自文档gem install --help

  

- 保守不要尝试升级已达到版本要求的宝石

答案 1 :(得分:1)

您可能希望使用像gembundler这样的外部来处理项目的gem安装。

如果必须直接使用rubygems,请执行

之类的命令
ruby -e "puts `gem install GEMTOINSTALL` if(`gem list --no-versions | grep GEMTOINSTALL`) == ''"

会做这个工作。

答案 2 :(得分:1)

这就是我们使用bundle install的原因。此命令将查看宝石的gemfile

这个Gemfile说了几件事。首先,它说Bundler应该在http://rubygems.org寻找在Gemfile中声明的gem。您可以声明多个Rubygems源,并且bundler将按您声明源的顺序查找gem。

Bundler将连接到rubygems.org(以及您声明的任何其他来源),并找到满足您指定要求的所有必需gem的列表。因为Gemfile中的所有宝石都有自己的依赖项(其中一些有自己的依赖项),所以在bundle install上运行Gemfile会安装很多宝石。

如果已经安装了任何所需的宝石, Bundler将使用它们。在您的系统中安装任何所需的宝石后,bundler会将其安装的所有宝石和版本的快照写入Gemfile.lock

当您运行bundle install时,bundler将(默认情况下)将您的宝石安装到您的宝石系统存储库。这意味着它们将显示在gem list中。此外,如果您正在开发大量应用程序,则无需为每个应用程序下载和安装共同的gem。这对于开发很有用,但对于部署来说有些问题。

在部署方案中,您部署的Unix用户可能无权将gem安装到系统位置。即使用户(或您使用sudo),启动应用程序的用户也可能无权访问它们。

因此,bundler附带了一个--deployment标志,该标志封装了在部署环境中使用bundler的最佳实践。

--deployment标记需要最新Gemfile.lock以确保您已完成的测试(在开发和暂存中)实际上反映了您放入production的代码。您可以在部署应用程序之前运行bundle check,以确保Gemfile.lock是最新的。请注意,如果您自上次更改bundle install以来已成功启动应用程序(或运行测试),则最新将始终最新