我已经阅读了rubygems网站上的文档,但我想“gem install”命令总是重新安装,重新编译所有内容,即使已经安装了相同的版本..
如何使gem install命令仅在需要时安装?
答案 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
以来已成功启动应用程序(或运行测试),则最新将始终最新 。