我已经阅读了 rubygems 站点的文档,但我猜“gem install”命令总是重新安装,重新编译所有内容,即使已经安装了相同的版本。
如何使 gem install 命令仅在需要时安装?
看起来该--conservative
标志将使 gem 命令执行您想要的操作。
gem install rake --conservative
从文档中gem install --help
:
--conservative 不要尝试升级已经满足版本要求的 gem
您可能希望使用gembundler之类的外部工具来处理项目的 gem 安装。
如果您必须为此直接使用 rubygems,则类似的命令
ruby -e "puts `gem install GEMTOINSTALL` if(`gem list --no-versions | grep GEMTOINSTALL`) == ''"
会做的工作。
这就是我们使用bundle install
. 此命令将查看gemfile
gems。
这个 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
.