12

我已经阅读了 ruby​​gems 站点的文档,但我猜“gem install”命令总是重新安装,重新编译所有内容,即使已经安装了相同的版本。

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

4

3 回答 3

29

看起来该--conservative标志将使 gem 命令执行您想要的操作。

gem install rake --conservative

从文档中gem install --help

--conservative 不要尝试升级已经满足版本要求的 gem

于 2013-05-09T21:48:24.303 回答
2

您可能希望使用gembundler之类的外部工具来处理项目的 gem 安装。

如果您必须为此直接使用 ruby​​gems,则类似的命令

ruby -e "puts `gem install GEMTOINSTALL` if(`gem list --no-versions | grep GEMTOINSTALL`) == ''"

会做的工作。

于 2013-01-24T14:06:08.160 回答
1

这就是我们使用bundle install. 此命令将查看gemfilegems。

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

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

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

当您运行时bundle install,bundler 将(默认情况下)将您的 gem 安装到系统的 gems 存储库中。这意味着他们将出现在gem list. 此外,如果您正在开发多个应用程序,则无需为每个应用程序下载和安装通用的 gem。这对于开发来说很好,但对于部署来说有些问题。

在部署场景中,与您一起部署的 Unix 用户可能无权将 gem 安装到系统位置。即使用户这样做(或者您使用 sudo),启动应用程序的用户也可能无法访问它们。

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

--deployment标志需要更新Gemfile.lock以确保您所做的测试(在开发和登台中)实际上反映了您放入的代码production。您可以bundle check在部署应用程序之前运行以确保您的应用程序Gemfile.lock是最新的。请注意,如果bundle install上次更改Gemfile.

于 2013-01-24T14:25:30.990 回答