如何在权限错误时安装gem或更新RubyGems

639

我试图使用gem install mygem安装一个gem或者使用gem update --system更新RubyGems,但是出现了以下错误:

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

有人有解决这个问题的想法吗?

6
这是我的解决方案: https://dev59.com/1VsX5IYBdhLWcg3wPdU7#34071869 - LanceP
80
sudo chown -R $USER /Library/Ruby/Gems/ 这句话的意思是将 "/Library/Ruby/Gems/" 目录下所有的文件和子目录的拥有者改为当前用户。sudo 是一个命令,用于以超级管理员权限运行该命令后面的操作。chown 命令用于修改文件或目录的拥有者和所属组。-R 表示递归地修改该目录下所有文件和子目录的拥有者。$USER 是一个环境变量,表示当前用户的用户名。 - vaskort
1
我使用的是zsh shell,出现了~/.zshrc路径问题。我在文件末尾加入了以下这行代码,问题得到了解决: export PATH="$HOME/.rbenv/shims:$PATH" - rosnk
32个回答

535

尝试添加--user-install而不是使用sudo

gem install mygem --user-install

4
我不知道为什么你的答案之前没有被发布。显然,“--user-install”选项已经存在了一段时间。我只是希望你早些时候就写出这个答案。 =) - Michael
8
这个需要置顶!使用sudo或su进行安装是不明智的,因为你会将权限系统强加到模块上,可能会与其他已安装的软件包或项目依赖项冲突。使用rbenv需要你再安装另一个软件,并增加了一层复杂性。 - Hubert Grzeskowiak
8
这个方法可行,但会警告:'警告:您的路径中没有 /Users/<username>/.gem/ruby/2.0.0/bin, gem 可执行文件将无法运行。' 以下链接提供了有用的说明,介绍如何更新您的路径(而不必使用 vi)http://hathaway.cc/post/69201163472/how-to-edit-your-path-environment-variables-on-mac - dawid
4
这很简单、也很合理。如果您的bashrc中没有加入ruby路径,请添加以下内容:if which ruby >/dev/null && which gem >/dev/null; then PATH="$(ruby -rubygems -e 'puts Gem.user_dir')/bin:$PATH" fi。 来源:http://guides.rubygems.org/faqs/#user-install - Inder Kumar Rathore
1
这会对苹果的(已安装Ruby)系统造成问题吗? - user5306470
显示剩余6条评论

336

你没有写入 /Library/Ruby/Gems/1.8 目录的权限。

这意味着,你没有在那里写入的权限。

那个目录是苹果为自己使用安装的 Ruby 版本。如果你知道自己在做什么,对它进行小的修改是可以的,但由于你不确定权限问题,我建议你不要沿着这条路继续前进。

相反,我强烈建议你考虑使用 rbenvRVM 来管理一个单独的 Ruby,安装到你的主目录下的沙盒中,你可以在不担心损坏系统 Ruby 的情况下修改/折叠/扭曲/更改它。

两者之间,我使用 rbenv,虽然我过去经常使用 RVM。rbenv 采用了更“不干涉”你的 Ruby 安装的方式。RVM 有很多功能,非常强大,但结果是更具侵入性。无论哪种情况,在开始安装任何你选择的东西之前,先阅读其安装文档几次


185
不必使用单独的Ruby库,只需像Michael上面建议的那样,在命令前加上'sudo'即可。 - serraosays
37
更改苹果安装的Ruby的所有权并不是一个好主意,因为系统安装/升级和磁盘工具可以自动恢复/修复目录的所有权和权限。这将使用户感到沮丧,并可能使期望拥有这些目录的写入权限/所有权的操作系统和代码感到沮丧。苹果安装使用其Ruby的应用程序,并可能期望某个版本或行为,因此这些应用程序可能会出现问题。既然使用RVM或rbenv更容易更安全,为什么还要费心去改变呢? - the Tin Man
211
对于像我这样实际上不从事 Ruby 开发并且不想浪费半个小时来弄清楚所有这些 crystal 东西的人来说,brew install ruby 可以以一种干净的方式解决您的依赖问题,而不会破坏 Apple 的安装。如果您已经在初始安装中使用了 sudo 进行更新并担心自己所做的事情,您应该可以通过以下方式撤消它:cd /System/Library/Frameworks/Ruby.framework/Versions;sudo rm Current; sudo ln -s 1.8 Current; - lsl
24
我执行了sudo tangle并修改了预安装的Ruby。我按照您提供的步骤尝试修复问题,但现在当我执行irb或ruby -v时,会出现“command not found”的提示。发生了什么事?有没有解决方法?这更加证明了为什么人们不应该使用sudo或chown。唉... - the Tin Man
55
解决方法:在 El Captain 上执行 brew install ruby 后,只需关闭终端并重新打开即可。 - Fmessina
显示剩余17条评论

97

你真的应该使用Ruby版本管理器。

正确使用可以预防并解决运行gem update命令时的权限问题。

我推荐使用rbenv

然而,即使你使用了Ruby版本管理器,你仍然可能会收到相同的错误信息。

如果出现这种情况,并且你正在使用rbenv,请验证~/.rbenv/shims目录是否在系统Ruby的路径之前。

$ echo $PATH 会显示你的加载路径顺序。

如果你发现shims目录位于系统Ruby bin目录之后,请编辑你的~/.bashrc文件,并将以下代码作为最后一个导出PATH命令: export PATH=$HOME/.rbenv/shims:$PATH

$ ruby -v 会显示你当前正在使用的Ruby版本。

这表明我目前正在使用系统版本的Ruby(通常不太好)。

$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

$ rbenv global 1.9.3-p448 将我切换到一个更新的、预安装的版本(见下面的参考文献)。

这表明我正在使用一个更新的 Ruby 版本(可能不会引起 Gem::FilePermissionError 的错误)。

$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]

通常情况下,您不需要在 gem 命令前加 sudo。如果您觉得需要这样做,那么可能有一些配置出了问题。

关于 rbenv 的详细信息,请参见以下内容:


9
如果你使用 rbenv,按照 Homebrew 安装指南 的步骤进行操作,就不需要自己搞定密码问题了。只需将 eval "$(rbenv init -)" 添加到你的 shell 配置文件中,rbenv 就会为你设置好 PATH - user456814
谢谢。我忘记了“rbenv global”,所以我仍在使用系统ruby,而gem install失败了。 - Graham Perks

78

这将以简洁的方式解决MacOS Mojave和Catalina上的问题:

brew install ruby

然后将GEM_HOME设置为您的用户目录。在终端上:

  • Bash

echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
echo 'export GEM_HOME=$HOME/gems' >> ~/.bashrc
echo 'export PATH=$HOME/gems/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
  • 如果使用的是Zsh:

    echo '# Install Ruby Gems to ~/gems' >> ~/.zshrc
    echo 'export GEM_HOME=$HOME/gems' >> ~/.zshrc
    echo 'export PATH=$HOME/gems/bin:$PATH' >> ~/.zshrc
    source ~/.zshrc
    

  • 1
    直到我运行了 xcode-select --install,这才对我起作用。这是编译扩展所必需的。 - Marc Perrin-Pelletier
    1
    我运行了这个程序,但我想要能够重置这些所做的更改,你知道如何还原吗?@Fmessina - KarenAnne
    编辑您的 ~/.bashrc~/.zshrc 文件,删除添加的 3 行,并重新运行 source ~/.bashrc 命令,然后应该可以正常工作了。 - Fmessina
    3
    请注意,在执行此操作后,您应该使用“gem install…”而不是许多安装指南中所指示的“sudo gem install…”。 - sagism

    74

    为什么不这样做:

    sudo gem update --system
    

    43
    将 gems 安装为 root 用户并不是一个好主意。https://dev59.com/AXI95IYBdhLWcg3w2h96 - spuder
    13
    如果你必须使用SUDO,说明在你的设置中出现了问题,请使用rbenv或rvm,永远不要使用SUDO。 - Chris Hough
    14
    为什么每个人解决权限问题的方法都是在命令前加上sudo?这为什么是最佳实践? - Steven
    hyh:qzc.xcodeproj ylgwhyh$ gem install cocoapods 错误:执行gem时出错...(Gem :: FilePermissionError) 您没有对/Library/Ruby/Gems/2.0.0目录的写入权限。 - ylgwhyh
    不行。"错误:执行 gem 时出错...(Errno::EPERM)" - JGallardo
    显示剩余2条评论

    36

    对我来说,问题是由于使用rbenv并忘记全局设置正确版本造成的。

    因此,我必须使用rbenv global xxx进行设置。

    在我的情况下,我安装了2.0.0-p247,所以我必须发出以下命令:

    rbenv global 2.0.0-p247
    rbenv rehash
    

    然后一切正常运作。


    4
    如果你已经在使用rbenv,并且在升级OSX到新版本后安装gem时收到了权限错误,你可以按以下步骤操作:首先设置rbenv版本 rbenv global 2.1.1,然后运行 rbenv rehash。现在重新运行 gem install 命令即可。 - njappboy
    1
    重启终端。 - XåpplI'-I0llwlg'I -
    1
    未来的开发者们:rbenv rehash已经被弃用。请参考https://github.com/rbenv/rbenv-gem-rehash。 - TCannadySF
    完美解决了我的问题!我缺少的是 rbenv rehash - James
    值得注意的是,如果没有设置全局 Ruby 版本,那么系统 Ruby 可能会缺少权限,而 rbenv 将使用系统 Ruby。可以通过 rbenv versions 命令进行验证。 - Dennis

    26

    你需要更正你的路径。

    为了确定这个修复是否有效,请运行以下命令:

    which gem
    

    这应该输出一个您没有权限访问的目录:

    /usr/bin/gem
    

    要解决这个问题,请执行以下步骤:

    1. 确定您需要复制到个人资料的路径:

      rbenv init -
      

      输出的第一行是您需要复制到您的个人资料中的行:

      export PATH="/Users/justin/.rbenv/shims:${PATH}" #path that needs to be copied
      source "/usr/local/Cellar/rbenv/0.4.0/libexec/../completions/rbenv.zsh"
      rbenv rehash 2>/dev/null
      rbenv() {
          typeset command
          command="$1"
          if [ "$#" -gt 0 ]; then
              shift
          fi
      
          case "$command" in
              rehash|shell)
                  eval `rbenv "sh-$command" "$@"`;;
              *)
                  command rbenv "$command" "$@";;
          esac
      }
      
    2. 复制你的个人资料路径并保存。

    3. 重新加载你的个人资料(对我来说是source ~/.zshenv)。

    4. 运行 rbenv rehash

    现在当你运行 which gem 时,你应该得到一个本地路径,你有权限访问:

    /Users/justin/.rbenv/shims/gem
    

    这就是我遇到的问题。你应该能够在你的~/.bash_profile中包含eval "$(rbenv init -)",以使所有必要的更改生效。 - nyi
    最佳答案:我的配置文件名为.bash_profile,您可以像这样打开该文件:touch ~/.bash_profile; open ~/.bash_profile并在第1点提到的行中添加该行。 - CarmenA

    17

    在使用我下面的原始回答之前,请尝试nathanwhy的答案。他建议使用--user-install可以达到相同的目的,而无需干扰您的.bash_profile或确定您的Ruby版本。


    如果您不关心特定的Ruby版本,则可以跳过复杂的Ruby环境管理器选项,只需将这些行添加到~/.bash_profile中:

    export GEM_HOME="$HOME/.gem/ruby/2.0.0"
    export GEM_PATH="$HOME/.gem/ruby/2.0.0"
    

    该路径是从gem env的原始输出中获取的:

    RubyGems Environment:
      - RUBYGEMS VERSION: 2.0.14
      - RUBY VERSION: 2.0.0
      - INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.0.0
      - RUBY EXECUTABLE: /System/Library/.../2.0/usr/bin/ruby
      - EXECUTABLE DIRECTORY: /usr/bin
      - RUBYGEMS PLATFORMS:
        - ruby
        - universal-darwin-14
      - GEM PATHS:
         - /Library/Ruby/Gems/2.0.0
         - /Users/mylogin/.gem/ruby/2.0.0  #  <---- This line, right here. -----
         - /System/Library/.../usr/lib/ruby/gems/2.0.0
      ...
    

    无需使用 sudo,您可以使用由苹果提供的预装 Ruby。


    3
    对我来说,这非常有效。并不是每个人都是使用机器的系统管理员,因此并不是每个人都可以访问'sudo'、'chown'或类似的工具。同样地,人们应该知道“gem install --user-install”,它将gem安装到用户主目录中的一个目录,而不是安装到所有用户共享的目录中。 - Some Guy

    17

    这对我很有效。此外,如果您以前使用 root 用户安装了 gem 包,它会通过将所有权更改回您来修复此问题(从安全角度来看更好)。

    sudo chown -R `whoami` /Library/Ruby/Gems
    

    1
    绝对不要更改/Library文件夹的权限,否则系统在未来的更新中可能会出现问题。(回复晚了很抱歉) - Raptor
    @Raptor 我正在修改子文件夹的权限,而不是“/Library”。在我的情况下,我错误地将gem安装为root用户,所以我想撤销这个操作。理论上我想不到任何负面影响,也没有观察到任何负面影响。我很好奇 - 你认为这是一个坏主意的原因是什么? - thebiggestlebowski
    这个路径是系统相关的。macOS 的进一步更新可能会导致其失效。 - Raptor
    默认情况下,这个 gem 是安装在此位置的。由于它被错误地安装为 root (sudo) 而不是我的常规用户,因此它无法使用。我所做的事情的结果与一开始就像 $USER 安装的结果相同。我并不觉得有什么危害。这里的大多数其他答案提出了相同的结果/解决方案,但是实现方式不同。我仍然没有看到问题所在。难道你是说应该不将 gem 安装在 /Library 下吗? - thebiggestlebowski

    15

    有两种方法:使用rbenv或RVM。下面列出了两种的步骤。在执行这些步骤之前,您可能希望关闭gems本地文档的安装。

    echo "gem: --no-ri --no-rdoc" >> ~/.gemrc
    

    然后:

    安装 rbenv

    安装 ruby-build

    运行:

    rbenv install 2.1.2 (or whatever version you prefer)
    rbenv global 2.1.2
    gem update --system
    

    这将在您的本地目录中安装一个最新版本的 gem 系统。这意味着您不会干扰系统配置。如果您正在问这个问题,那么您不应该干涉系统安全,而且您可能需要更长时间来了解可能遇到的问题,而不仅仅是通过一种简单的方式来避免您开始时的问题。当你对操作系统和编程有更多了解时,再学习信息安全。

    作为替代,您可以使用“RVM”:要安装 RVM,请运行:

    rvm install 2.1.2
    rvm use 2.1.2
    gem update --system
    

    这个方法会得到相同的结果,你将得到一个本地的 Ruby 和 Gem 系统,不会干扰系统版本。无需使用 Homebrew 或覆盖系统库等操作。


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