如何安装一个宝石或更新RubyGems,如果它失败与权限错误

我试图使用gem install mygem安装一个宝石或使用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.

有人知道怎么解决这个问题吗?

549361 次浏览

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

也就是说,你没有权限在那里写东西。

这是苹果安装的Ruby版本,供他们自己使用。虽然可以对如果你知道自己在做什么进行小的修改,因为您不确定权限问题,但我认为继续这样做不是个好主意。

相反,我强烈建议您考虑使用rbenv数位视讯来管理一个单独的Ruby,安装到您的主目录中的沙箱中,这样您就可以修改/折叠/主轴/更改,而不必担心会弄乱系统Ruby。

在这两者之间,我使用rbenv,尽管我过去经常使用RVM。rbenv采用了一种更加“不干涉”的方法来管理Ruby安装。RVM有很多特性并且非常强大,但是,结果是更具有侵入性。在任何一种情况下,在开始安装之前,都要多次查看它们的安装文档

该错误的原因是您没有以root用户登录终端。

如果你已经在终端类型的mac上启用了根用户

$ su

如果您没有root用户,您需要使用以下步骤启用它

  1. 从Apple菜单中选择系统首选项....
  2. 从视图菜单中选择Users &组。
  3. 单击锁定并以管理员帐户身份进行身份验证。
  4. 点击登录选项....
  5. 点击右下角的“编辑…”或“加入…”按钮。
  6. 点击“打开目录实用程序…”按钮。
  7. 单击“目录实用工具”窗口中的锁。
  8. 输入管理员帐户名和密码,然后单击“确定”。
  9. 从“编辑”菜单中选择“启用根用户”。
  10. 在password和Verify字段中输入希望使用的根密码,然后单击OK。

更多在相同的http://support.apple.com/kb/ht1528

在被困了几个小时后,至少它对我有用。

你为什么不这样做:

sudo gem update --system
sudo gem update --system
sudo gem install (gemfile)

您确实应该使用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的详细信息请参见:

  • https://github.com/sstephenson/rbenv < a href = " https://github.com/sstephenson/rbenv " > < / >
  • http://robots.thoughtbot.com/post/47273164981/using-rbenv-to-manage-rubies-and-gems < a href = " http://robots.thoughtbot.com/post/47273164981/using-rbenv-to-manage-rubies-and-gems " > < / >

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

所以我必须设置为rbenv global xxx

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

rbenv global 2.0.0-p247
rbenv rehash

然后一切都运转正常。

我需要做一个rbenv rehash,这样它就会指向我的本地Gem库。

看起来您已经让您的gem管理器指向系统库,因此,与其混淆权限,不如为您的管理器执行等效的“rehash”以获得指向本地的内容。

更老更睿智

不要做我在这里说的,只要知道在任何时候使用sudo都要小心。您可能希望使用rbenv之类的东西来隔离您正在做的任何工作。


的一种方式

了解chown

我不知道您是否喜欢命令行,但这将使使用任何工具在任何项目中安装包到您的系统变得轻而易举。

据我所知,chown代表改变所有权。

我来寻找这个答案的原因是因为gem install今天向我抛出了这个错误:

ERROR:  While executing gem ... (Gem::FilePermissionError)
You don't have write permissions into the /var/lib/gems/1.9.1 directory.

这是使用chown的绝佳机会。你看,Ruby已经给了我们它需要访问的目录,而且它似乎会经常使用这个目录。

在这种情况下,要解决这个问题只需要知道三件事,但是chown要强大得多,并为您提供了比我现在要演示的更大的灵活性。更多信息请参考下面的资料。

两件事

  1. 用户名
  2. 目录

如果您在shell中查找用户名很容易。看看提示就知道了。我的是这样的:

breadly@breadly-desktop:~\Desktop

当前用户只是@之前的名称。我们从错误消息中知道了目录,但是您有两种选择。您可以使用../gems/1.9.1将权限限制在当前版本,也可以使用../gems为所有版本的gems授予写权限。

实际更改所有权的命令如下所示。

chown -R $(whoami) /absolute/path/to/directory

-R被称为标志,-R标志通常告诉命令递归地执行某项操作,或者换句话说,对目录中包含的所有内容以及包含在该目录中的所有内容执行该命令,依此类推,直到没有其他内容为止。

有两种路由:使用rbenv或RVM。下面是这两种食物的食谱。在此之前,您可能希望关闭gem本地文档的安装。

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

然后:

install rbenv

install ruby-build

运行:

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

这将在本地目录中安装gem系统的最新版本。这意味着您不会干扰系统配置。如果您正在问这个问题,那么您不应该破坏系统安全性,并且您将花费更长的时间来了解可能遇到的问题,而不仅仅是找到一种简单的方法来避免您开始时遇到的问题。了解更多关于操作系统和编程的知识后,再学习InfoSec。

使用'RVM'代替:

rvm install 2.1.2
rvm use 2.1.2
gem update --system

这有同样的结果,您最终得到的是一个本地Ruby和Gem系统,它不会影响系统版本。不需要Homebrew,也不需要覆盖系统库等等。

我用它工作。

# EYZ0

cd /图书馆/ Ruby /珠宝/ 2.0.0

开放。

右击获取信息

点击锁定

地方的密码

让一切都能读能写。

我发现这个如何为sudoless宝石:

  1. # EYZ0
  2. # EYZ0
  3. 添加出口到.bashrc:

    export RBENV_ROOT="$(brew --prefix rbenv)"
    export GEM_HOME="$(brew --prefix)/opt/gems"
    export GEM_PATH="$(brew --prefix)/opt/gems"
    
  4. And finally add this to your ~/.gemrc:

    gem: -n/usr/local/bin
    
  5. gem update --system

你需要修正你的路径。

要确定此修复是否有效,请运行以下命令:

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. < p > # EYZ0运行。

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

/Users/justin/.rbenv/shims/gem

检查你的Ruby版本是否正确。如果不是,那就改变它。

这对我来说很管用:

$ rbenv global 1.9.3-p547
$ gem update --system

为我工作:

sudo gem uninstall cocoapods


sudo gem install cocoapods

在使用下面我的原始答案之前,请尝试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
...

不需要sudoing,您可以使用已经安装的Ruby,这是Apple提供的。

安装gem或更新RubyGems失败,出现权限错误,然后输入此命令

sudo gem install cocoapods

正如bobbdelsol所指出的,rehash对我来说很管用:

==> which ruby
/usr/bin/ruby


==> rbenv install 1.9.3-p551
Downloading ruby-1.9.3-p551.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p551.tar.bz2
Installing ruby-1.9.3-p551...
Installed ruby-1.9.3-p551 to /Users/username/.rbenv/versions/1.9.3-p551




==> which ruby
/Users/username/.rbenv/shims/ruby


==> which gem
/Users/username/.rbenv/shims/gem


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




==> ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]




==> rbenv global 1.9.3-p551




==> ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]




==> rbenv global 1.9.3-p551




==> rbenv rehash




==> ruby -v
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin15.4.0]




==> gem install compass
Fetching: sass-3.4.22.gem (100%)
Fetching: multi_json-1.11.3.gem (100%)
Fetching: compass-core-1.0.3.gem (100%)
Fetching: compass-import-once-1.0.5.gem (100%)
Fetching: chunky_png-1.3.5.gem (100%)
Fetching: rb-fsevent-0.9.7.gem (100%)
Fetching: ffi-1.9.10.gem (100%)
Building native extensions.  This could take a while...
Fetching: rb-inotify-0.9.7.gem (100%)
Fetching: compass-1.0.3.gem (100%)
Compass is charityware. If you love it, please donate on our behalf at http://umdf.org/compass Thanks!
Successfully installed sass-3.4.22
Successfully installed multi_json-1.11.3
Successfully installed compass-core-1.0.3
Successfully installed compass-import-once-1.0.5
Successfully installed chunky_png-1.3.5
Successfully installed rb-fsevent-0.9.7
Successfully installed ffi-1.9.10
Successfully installed rb-inotify-0.9.7
Successfully installed compass-1.0.3
9 gems installed
Installing ri documentation for sass-3.4.22...
Installing ri documentation for multi_json-1.11.3...
Installing ri documentation for compass-core-1.0.3...
Installing ri documentation for compass-import-once-1.0.5...
Installing ri documentation for chunky_png-1.3.5...
Installing ri documentation for rb-fsevent-0.9.7...
Installing ri documentation for ffi-1.9.10...
Installing ri documentation for rb-inotify-0.9.7...
Installing ri documentation for compass-1.0.3...
Installing RDoc documentation for sass-3.4.22...
Installing RDoc documentation for multi_json-1.11.3...
Installing RDoc documentation for compass-core-1.0.3...
Installing RDoc documentation for compass-import-once-1.0.5...
Installing RDoc documentation for chunky_png-1.3.5...
Installing RDoc documentation for rb-fsevent-0.9.7...
Installing RDoc documentation for ffi-1.9.10...
Installing RDoc documentation for rb-inotify-0.9.7...
Installing RDoc documentation for compass-1.0.3...

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

gem install mygem --user-install

这对我很管用。另外,如果你之前以根用户的身份安装了gems,它会通过将所有权交还给你来解决这个问题(更安全)。

sudo chown -R `whoami` /Library/Ruby/Gems
我格式化了我的Mac,许多建议的解决方案都不适合我。 对我来说有用的是这些命令的正确顺序:

  1. < p >安装自制程序:

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    
  2. Install Ruby:

    brew install ruby
    
  3. Install Compass:

    sudo gem install compass
    

你可以使用:gem install cocoapods——pre——user

安装rbenv: brew install rbenv;

然后把eval "$(rbenv init -)"放在~/的末尾。Bash_profile(或~/.zshrc MacOS); < / p >

打开一个新终端,运行gem install ***就可以了!

这将以一种干净的方式修复MacOS Mojave和Catalina的问题:

brew install ruby

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

  • < p > # EYZ0:

    echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
    echo 'export GEM_HOME=$HOME/gems' >> ~/.bashrc
    echo 'export PATH=$HOME/gems/bin:$PATH' >> ~/.bashrc
    source ~/.bashrc
    
  • OR如果在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
    

给用户$whoami在这些文件夹中创建一些东西

sudo chown -R user /Library/Ruby/Gems/2.0.0

在MacOS Mojave上成功测试:

  1. 卸载所有旧的ruby版本(假设你有2.00和2.3.0):

    # EYZ0

    # EYZ0 < / p >

  2. 安装全新的ruby版本:

    # EYZ0 < / p >

  3. 设置默认别名为您的版本:

    # EYZ0 < / p >

  4. 重新启动您的系统,因为这是您的计算机加载最新安装的新ruby版本的最安全的方式。

完成上述步骤后,您可以成功运行任何gem命令。

# EYZ0

您可以更改GEM_HOME。您还在您的主目录下有一个gem文件夹来检查它的使用

$ gem env

结果如下。不相关的部分省略。

...
- GEM PATHS:
- /Users/xxx/.gem/ruby/2.6.0
- /Library/Ruby/Gems/2.6.0
- /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0
...
 

您可以使用/Users/xxx/.gem/ruby/2.6.0文件夹。

vim ~/.bash_profile

添加以下行

export GEM_HOME=~/.gem/ruby/2.6.0/

之后你就可以使用了

source ~/.bash_profile

2021年方案(使用rvm):

如果您在终端中输入which ruby,它显示/usr/bin/ruby,您可以尝试此解决方案。

  1. < p >安装区

    curl -L https://get.rvm.io | bash -s stable
    
  2. 使用RVM安装ruby

    rvm install "ruby-3.0.0"
    
  3. 使用您安装的ruby版本

    rvm use ruby-3.0.0
    
  4. 再次输入which ruby,这将显示/Users/mac_user_name/.rvm/rubies/ruby-3.0.0/bin/ruby

    这是使用ruby的新途径。

我的问题是,我之前从zshell切换到bash,没有登录:

/bin/bash --login

虽然我已经安装了rvm,但它无法切换到我新安装的rvm ruby版本,并且仍然试图使用默认的mac安装的ruby二进制。因此我的困惑(用户错误!!)和持续的权限问题…

ERROR: While execution gem…(Gem:: FilePermissionError) 你没有写/Library/Ruby/Gems/2.6.0

的权限
< p >(2022方案) 问题的详细原因已添加在这里

问题概述>这个问题与ruby访问有关,M1 macOS自带ruby。我们没有被允许为我们的目的使用它。相反,我们创建了一个单独的ruby实例,并将其用于我们的目的。

下面的步骤帮助我解决了这个问题,希望这可能会有所帮助

我们不需要安装rvn或chruby ruby。 我的解决方案是使用自制程序安装ruby

  1. 打开终端

  2. 使用自制程序安装ruby

[新安装]brew install ruby

[用于重新安装]brew reinstall ruby

  1. 使用以下命令查看ruby的路径

    # EYZ0

  2. 它应该安装在下面的路径

    # EYZ0

  3. 修改ruby路径为用户路径

检查您的系统使用了哪个shell

echo $0


-zsh

对于zshrc

# EYZ0

在bash

# EYZ0

  1. 退出并重新启动终端

  2. 在步骤5改变路径后

  3. 再次检查ruby的路径(执行步骤3 -请确保路径显示如下所示)

# EYZ0

[如果您不退出并启动终端,将显示步骤4路径]

  1. 这一步可能不适用,每个人都可以跳过第10步&11,如果你安装了正确的Cocoapods版本

检查安装的pod的版本

# EYZ0

  1. 使用下面的命令卸载特定版本的Cocoapods

如果安装的版本是1.11.0

# EYZ0

  1. 安装特定版本的Cocoapods

    安装cocoapods 1.11.0

  2. 将路径更改为项目目录cd{项目目录的路径}

  3. 在项目目录下安装捆绑器

# EYZ0

  1. 执行pod安装

# EYZ0