“sudo gem install”或“gem install”以及gem位置

170

执行 'sudo gem list --local' 和 'gem list --local' 命令会给出不同的结果。我的 gem 路径设置在我的主文件夹中,只包含来自 'gem list --local' 的宝石。

在计算机上安装宝石应该不要安装在不同的目录中,因此我是否应该将gem路径设置为不同的值,并且在安装软件时是否应该始终使用 sudo

my ~/.profile
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"

~/.bash_profile是空的。


2
我认为对于我们这些必须使用需要 root 权限的 gem 的人来说,这是一个有效的问题。 - Kelly
1
相关链接:https://dev59.com/vXvaa4cB1Zd3GeqPB1bw。我使用rbenv来管理Ruby版本,因为我使用了`sudo gem install rails而不是gem install rails`,所以遇到了问题。 - Dennis
4
我认为对于那些需要使用需要 root 权限的 gem 的人来说,这是一个合理的问题。我认为任何需要 root 权限才能安装或运行的 gem 都非常可疑。Gem 应该能够在沙盒中运行并在用户权限下运行。 - the Tin Man
2
sudo 就像是一把指向你脚的已上膛的枪。如果不了解它的作用以及如何影响你的系统,就像闭着眼睛扣动扳机一样危险。你可能会打出一个洞,也可能不会,但无论如何,除非你知道如何撤销损坏,否则你不想冒这个风险。使用 sudo 会写入系统拥有的 Ruby,而在 Mac OS 上,这是由 Apple 安装用于他们自己的用途。我们可以利用它,但更改错误的内容可能会破坏他们的代码。这就是为什么我们要从源代码安装或使用其他东西进行安装,以便我们可以安全地进行调整。 - the Tin Man
8个回答

163

您可以使用以下方式在本地环境中安装gems(无需使用sudo

gem install --user-install <gemname>

我建议这样做,这样即使是单用户计算机,您也不要去更改系统级配置。

您可以通过查看gem environment中的gem路径来检查宝石的位置。在我的情况下,它是“〜/ .gem / ruby / 1.8”。

如果您需要将本地安装的二进制文件添加到路径中,则可以像以下内容一样将其添加到bashrc中:

if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

(来自http://guides.rubygems.org/faqs/#user-install)


29
与上面的"另一个配置工具"解决方案 RBENV / RVM 相比,我支持这个选项。+1 - jjpe
1
我正在创建一个 gem,根据手册,我必须执行 rake install 命令,并且为了解决 sudo 问题,我不得不手动修补 /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rb 文件,在那里添加了 --user-install。找不到更好的解决方案,因为似乎 rake install 不接受其他参数。 - Nakilon
我对那个第一个命令感到非常兴奋。我一直在尝试安装gems,但由于没有sudo权限而遇到了问题。那个命令起作用了!!! - Caleb Kleveter
ruby -r rubygems -e 'puts Gem.dir'ruby -r rubygems -e 'puts Gem.user_dir' 分别打印全局和用户 gem 的路径。gem env homegem env user_gemhome(Ruby 3.2.0) 执行相同的操作。 - Míng

154

与其他所有帖子相反,我建议在安装gems时不要使用sudo

相反,我建议你安装RVM,并开启一个快乐的生活,拥有可移植的gem目录和不同版本的Ruby,全部都在一个环境下。

对于初学者,从文档中可以了解到:

RVM是一个命令行工具,可以让我们轻松地安装、管理和使用多个ruby环境和gem集合。

之所以使用sudo安装gems比使用gem install更糟糕,是因为它会将gems安装为所有用户,即以root身份运行。如果您是唯一使用该机器的人,则可能没有问题,但如果不是,则可能会出现奇怪的情况。

如果您决定要清除所有gems并重新开始,则作为非root用户进行此操作会更容易和更安全。

如果您决定要使用RVM,则使用sudo将会导致各种奇怪的问题,因为通过RVM安装的每个Ruby版本都有自己的GEM_HOME。

此外,如果您能够使开发环境尽可能接近生产环境,则更好,而在生产环境中,您很可能会以非root用户身份安装gems。


15
+1 对于rvm建议,但-1 对于混淆替代可能性的sudo使用的谴责。 - tfwright
10
好的,但你所有的理由归结为“因为RVM非常好”,而不是因为使用sudo特别有害。您不想使用sudo的唯一情况是在使用共享计算机时。如果您想推荐rvm,就直接这样做。无需诋毁其他工具。 - tfwright
7
我努力避免散播恐慌情绪,并尝试提供非 RVM 相关的理由,如果看起来似乎有这种倾向,我感到抱歉。 - jonnii
10
RVM是一个不错的选择,但你应该尝试一个更好的选择,RBENV。它比RVM更加轻便。 - Andres
4
@HontváriJózsefLevente,很难在评论中回答你的所有问题,但简单来说,您希望开发环境尽可能接近生产环境。如果您正在开发两个应用程序,其中一个使用ruby 2.1,另一个使用1.9,则需要确保本地环境使用正确的版本。这就是RVM或RBENV为您提供的。您会使用它的原因与使用任何沙箱环境的原因相同,但在这种情况下的主要好处是隔离性。希望这有所帮助! - jonnii
显示剩余5条评论

42
更好的方法是将--user-install放在您的~/.gemrc文件中,这样您就不必每次都输入它。
gem: --user-install

18

如果您

  • 使用sudo安装了ruby gems
  • 希望在不使用sudo的情况下安装gems
  • 不想安装rvm/rbenv

请将以下内容添加到您的.bash_profile中:

export GEM_HOME=/Users/‹your_user›/.gem
export PATH="$GEM_HOME/bin:$PATH"

打开终端的新标签或者执行source ~/.bash_profile,然后您就可以开始了!


11
对于不使用Ruby、Rails、Rake及其他Ruby开发者使用或想使用的人而言,这个解决方案比使用rvm要简单得多。我并不在意拥有不同的ruby版本,我只想运行一些以gem形式分发的shell程序。谢谢! - Kevin G.

10
sudo gem install --no-user-install <gem-name>

将会在全局范围内安装您的 gem,也就是说它将可用于所有用户的上下文环境中。


1
它还可以覆盖供应商安装的 gem,而操作系统可能期望将其设置为特定版本。这可能会破坏依赖于它的代码。 - the Tin Man
3
它可能安装供应商未提供的gem,并以使其在系统上所有用户都可用的方式安装。令人轻微不满的是,到处的答案都假定读者是一个开发人员而不是实际上想要为所有用户提供特定版本的gem的系统管理员。 :D - dannysauer

9

如果你想要一个比RVM更轻便的选择,并且将所有内容放在用户特定的已知目录中,那么我建议使用与bundler相关的以下工具:

bundle install --path $HOME/.gem

如果您想将 gems 安装到相同的位置

gem install --user-install GEMNAME

将它们安装在你的用户目录下的 .gem/ruby/RUBYVERSION(关于--user-install选项,请查看本问题的其他评论)。这样可以使 gem 能够被 gem list 查询到,也能通过 gem uninstall 卸载等操作,而无需使用 sudo 权限。由 gem 或 bundler 安装的可执行脚本可以通过将其添加到 PATH 变量中来运行。

$HOME/.gem/ruby/RUBYVERSION/bin

$PATH添加到您的环境变量中。如果您在运行gem install --user-install时未设置它,gem本身会提醒您。


谢谢。是否可能使bundler默认执行此操作?(如果可以的话,这是一个好主意吗?) - joshtch

3
您可以使用以下命令将gem安装到Rails应用程序中的特定文件夹(例如vendor/)中:
bundle install --path vendor

现在唯一需要使用sudo来安装软件的程序就是你的包管理器。 - tjbp

1
在Mac上安装Ruby gems是一个常见的困惑和挫败源。不幸的是,大多数解决方案都是不完整、过时的,并提供错误的建议。我很高兴这里接受的答案说不要使用sudo,你永远不需要这样做,特别是如果你不理解它的作用。虽然我几年前使用过RVM,但我会推荐2020年使用chruby
这里的其他答案提供了安装gems的替代选项,但它们没有提到这些解决方案的限制。缺少的是各种选项的解释和比较以及为什么选择其中之一的说明。我尝试在我的Mac上安装Ruby gems的权威指南中涵盖大多数常见情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接