ChatGPT解决这个技术问题 Extra ChatGPT

'sudo gem install' 或 'gem install' 和 gem 位置

运行“sudo gem list --local”和“gem list --local”会给我不同的结果。我的 gem 路径设置为我的主文件夹,并且仅包含来自“gem list --local”的 gem。

将 gem 安装在我计算机上的不同目录中可能不太好,所以我应该将 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 为空。

我认为对于我们这些必须使用需要 root 权限的 gem 的人来说,这是一个有效的问题。
相关:stackoverflow.com/questions/21141584/…。我使用 rbenv 管理 Ruby 版本并遇到了问题,因为我使用了 sudo gem install rails 而不是 gem install rails
“我认为对于我们这些必须使用需要 root 权限的 gem 的人来说,这是一个有效的问题。”我认为任何需要 root 权限的 gem,无论是安装还是运行,都是高度可疑的。 Gems 应该能够在沙箱中运行并以用户的权限运行。
sudo 是一把上膛的枪,指向你的脚。在不了解它的作用以及它如何影响您的系统的情况下使用它就像闭着眼睛扣动扳机一样。您可能会在脚上打一个洞,也可能不会,但无论哪种方式,除非您知道如何消除损坏,否则您都不想冒险。使用 sudo 写入系统拥有的 Ruby,它在 Mac OS 上由 Apple 安装以供自己使用。我们可以搭载它,但改变错误的东西可能会破坏他们的代码。这就是为什么我们从源代码安装或使用其他东西来安装我们可以安全调整它的地方。

s
sschuberth

您还可以在本地环境中安装 gems(没有 sudo

gem install --user-install <gemname>

我建议您不要弄乱您的系统级配置,即使它是单用户计算机。

您可以通过使用 gem environment 查看 gempath 来检查 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


+1 此选项而不是上面的“另一个配置工具”解决方案,RBENV / RVM。
我正在创建一个 gem,根据手册我必须做 rake install 并修复 sudo isse,我必须手动修补 /Library/Ruby/Gems/2.0.0/gems/bundler-1.7.3/lib/bundler/gem_helper.rb 添加 --user-install 那里。找不到更好的解决方案,因为看起来 rake install 不接受其他参数。
我对第一个命令感到非常兴奋。我一直在尝试安装 gems 并且遇到问题,因为我没有 sudo 权限。该命令有效!!!!
t
the Tin Man

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

相反,我建议您安装 RVM 并开始与便携式 gem home 和不同版本的 Ruby 一起生活在一个屋檐下的幸福生活。

对于初学者,来自 the documentation

RVM 是一个命令行工具,它允许我们轻松安装、管理和使用多个 ruby 环境和 gems 集。

使用 sudo 安装 gem 比仅使用 gem install 更糟糕的原因是因为它将 ALL USERS 的 gem 安装为 root。如果您是唯一使用机器的人,这可能很好,但如果您不是,它可能会导致奇怪。

如果您决定要吹走所有的宝石并重新开始,那么以非 root 用户身份这样做会更容易、更安全。

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

此外,如果您可以使您的开发环境尽可能接近您的生产环境,那就太好了,并且在生产中您很可能会以非 root 用户身份安装 gems。


+1 表示 rvm 建议,但 -1 表示对仅使用 sudo 的替代可能性的令人困惑的谴责
好的,但你所有的理由都归结为“因为 RVM 太棒了”,而不是因为使用 sudo 特别有害。您唯一不希望的情况是您在共享计算机上的特定情况。如果你想推荐 rvm 就这样做。无需求助于 FUDD。
我试着不传播 FUD,我试着给出非 RVM 的理由,如果看起来是这样,我道歉。
RVM 是一个不错的选择。但是你应该尝试一个更好的,RBENV。它比 RVM 的侵入性更小。
@HontváriJózsefLevente 很难在评论中解决您的所有问题,但简而言之,您希望您的开发环境尽可能接近生产环境。如果您正在开发两个应用程序,其中一个使用 ruby 2.1,另一个使用 1.9,那么您需要确保您的本地环境使用正确的版本。这就是 RVM 或 RBENV 为您所做的。使用它的原因与使用任何沙箱环境的原因相同,但在这种情况下,主要好处是隔离。我希望这有帮助!
t
the Tin Man

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

gem: --user-install

D
David Salamon

万一你

使用 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 中打开一个新标签,您就可以开始了!


对于不使用 Ruby、Rails、Rake 以及任何其他 Ruby 开发人员使用/想要使用的人来说,这个解决方案比使用 rvm 容易得多。我真的不在乎拥有不同的 ruby 版本,我只想运行一些作为 gem 分发的 shell 程序。谢谢!
T
Tasos Koutoumanos
sudo gem install --no-user-install <gem-name>

将在全球范围内安装您的 gem,即它将可用于所有用户的上下文。


它还可以覆盖供应商安装的 gem,该操作系统可能希望将其设置为特定版本。这可能会破坏依赖它的代码。
...或者它可以安装供应商不提供的 gem,并以使其对系统上的所有用户可用的方式进行。有点令人恼火的是,所有的答案都假设读者是一个 dev v/sa 系统管理员,他确实想让所有用户都可以使用特定版本的 gem。 :D
T
Todd Vierling

相关(对于捆绑器用户),如果您想要一个更轻的 RVM 替代方案,它将所有内容放在用户特定的知名目录中,我建议使用:

bundle install --path $HOME/.gem

如果你想将 gems 安装到同一个地方

gem install --user-install GEMNAME

将安装它们,.gem/ruby/RUBYVERSION 在您的主目录中。 (请参阅关于 --user-install 的关于此问题的其他评论。)

这将使 gem 对 gem list 可见,可通过 gem uninstall 卸载等,而无需 sudo 访问。由 gem 或 bundler 安装的可运行脚本可以通过添加

$HOME/.gem/ruby/RUBYVERSION/bin

到您的 $PATH。如果您在执行 gem install --user-install 时未设置,gem 本身会告诉您这一点。


谢谢你。是否可以让捆绑程序默认执行此操作? (如果是这样,这是个好主意吗?)
t
the Tin Man

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

bundle install --path vendor

这个。这些天来,唯一需要 sudo 来安装软件的程序是你的包管理器。
m
monfresh

在 Mac 上安装 Ruby gem 是一个常见的困惑和挫折来源。不幸的是,大多数解决方案都是不完整的、过时的,并且提供了不好的建议。我很高兴这里接受的答案说不要使用 sudo,你永远不需要这样做,特别是如果你不明白它的作用。虽然我几年前使用过 RVM,但我会在 2020 年推荐 chruby

这里的其他一些答案提供了安装 gems 的替代选项,但他们没有提到这些解决方案的局限性。缺少的是对各种选项的解释和比较,以及为什么您可能会选择其中一个。我试图在我的 definitive guide to installing Ruby gems on a Mac 中介绍最常见的场景。