无法在OS X "El Capitan"上安装gems

184

我无法在El Capitan Beta 5上安装和运行fakes3 gem。

我尝试了以下方法:

sudo gem install fakes3
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/fakes3

然后我尝试按照CocoaPods的方式进行操作。虽然对于CocoaPods来说是有效的,但对于Fakes3则不行。

mkdir -p $HOME/Software/ruby
export GEM_HOME=$HOME/Software/ruby
gem install cocoapods
[...]
1 gem installed
gem install fakes3
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.

3
不要使用sudo安装Ruby或更改gems。相反,使用rbenvRVM来安装和管理Ruby。阅读并遵循它们各自网站上的说明。在任何情况下,在安装后,除非您知道正在更改什么以及为什么要这样做,否则不要使用sudo - the Tin Man
15个回答

335

免责声明: @theTinMan 和其他 Ruby 开发者经常指出在安装 gems 时不要使用 sudo,并指向诸如RVM之类的东西。当进行 Ruby 开发时,这是绝对正确的。请继续使用那些。

然而,我们中的许多人只想要一些二进制文件,这些二进制文件恰好作为 gem 分发(例如fakes3cocoapodsxcpretty...)。我绝对不想费心去管理一个单独的 ruby。以下是您更快的选择:

选项1:继续使用 sudo

如果您希望这些工具被全局安装,则使用 sudo 可能是可以的。

问题是这些二进制文件被安装到 /usr/bin 中,自 El Capitan 以来就受限了。但是,您可以将它们安装到 /usr/local/bin 中。那是Homebrew安装其内容的地方,因此它可能已经存在。

sudo gem install fakes3 -n/usr/local/bin

宝石将被安装到/usr/local/bin,如果在用户的路径中,则系统上的每个用户都可以使用它们。

选项2:在您的主目录中安装(不使用sudo)

以下内容将在~/.gem中安装宝石,并将二进制文件放在~/bin中(然后您应将其添加到PATH中)。

gem install fakes3 --user-install -n~/bin

设置为默认选项

无论哪种方式,您都可以将这些参数添加到您的~/.gemrc文件中,这样就不必记住它们:

gem: -n/usr/local/bin

echo "gem: -n/usr/local/bin" >> ~/.gemrc

或者

gem: --user-install -n~/bin

echo "gem: --user-install -n~/bin" >> ~/.gemrc

(提示: 您还可以添加--no-document来跳过生成Ruby开发者文档。)


非常感谢!我一直在为新版本的brew和ruby而苦苦挣扎,但仍然无法解决/usr/bin问题。在运行gem install时指定所需路径解决了这个问题。 - Daniel Saidi
.gemrc 文件应该有 gem: -n /usr/local/bin (-n 后面需要加一个空格)。 - Paul Schreiber
2
对于选项#2,加1,这是一个可行且安全的替代方案,如果您只想要那些没有单独Ruby的二进制文件。我们的主目录是添加宝石的完美位置,对PATH进行快速调整即可访问它们。我不能推荐选项#1,因为“某人”最终会覆盖宝石并破坏他们的系统Ruby或使用它的Apple内置代码,然后他们将在SO上提出另一个问题,询问如何修复它。 - the Tin Man
太棒了!这让我能够顺利安装jazzy。请参见https://github.com/realm/jazzy和https://github.com/realm/jazzy/issues/570。最初的错误是“ERROR: While executing gem ... (Errno :: EPERM)操作不允许 - /usr/bin/xcodeproj”。 - Max MacLeod
1
这是一个很好的答案,但可能已经过时了。在Sierra上,我需要的选项是--install-dir /usr/local/bin。 - Ryan Ballantyne
显示剩余8条评论

110
在我的情况下,我必须使用Brew重新安装Ruby。这似乎已经解决了问题,因为我可以再次安装gems。
brew install ruby

之后,您需要注销并重新登录,可以通过图形方式或仅重新启动终端实现。


对我来说很有效!我想它会消除捆绑的Ruby安装中的任何奇怪问题...在我看来,这是最好的解决方案。 - n13
你可以通过以下命令确定正在运行哪个 Ruby 版本:which -a ruby在我的机器上,它会返回以下结果:$ which -a ruby /usr/local/bin/ruby /usr/local/bin/ruby /usr/bin/ruby至于为什么 /usr/local/bin 会出现两次,看起来是因为 brew install ruby 命令会将其添加到 PATH 中,即使它已经存在。可以推测,/usr/local 中的 Ruby 配置了一个不需要 root 访问权限的 gem 安装位置(这实际上非常合理)。 - WallStProg
7
请注销并重新登录(通过终端),否则 gem install 将仍然失败。 - WallStProg
对我来说运行得很好。我将被接受的答案和这个答案结合起来。谢谢你们两个。 - youssman
1
你不需要注销并重新登录。只需运行 rehash 命令,确保你的 shell 知道 $PATH 中有一个新的 ruby。即使在你还没有在 shell 会话中运行 ruby 的情况下,这也是不必要的。 - Radon Rosborough
我必须将新的Ruby添加到我的PATH中,否则将使用Mac OS上预装的旧版本:echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.bash_profile - jahooma

38

这是因为OS X“El Capitan”的新安全功能所致。 尝试添加--user-install而不是使用sudo:

$ gem install *** --user-install
例如,如果您想要安装fake3,只需使用以下命令:
$ gem install fake3 --user-install

是的!非常感谢你! - Louis Magnotti
在尝试了30分钟的brew方法并关闭终端之后,这个解决方案最终在10.10.5上奏效了。但是仍然不确定为什么brew方法没有奏效。请澄清一下。在brew安装之后,ruby位于/usr/bin/ruby。 - vikramvi
1
哇,现在问题又出现了。gem install redcarpet -v '3.3.4' --user-install 报错:警告:您的 PATH 中没有 /Users/user_name/.gem/ruby/2.0.0/bin,因此 gem 可执行文件无法运行。之前我没有遇到这个错误。 - vikramvi
1
这篇文章最终帮助我解决了安装 gem 时出现的权限错误问题。 - vikramvi

24
sudo gem install -n /usr/local/bin cocoapods

试试这个。它肯定会起作用。


3
绝对不。 - Maarten Hartman

19

您需要更新Xcode到最新版本(v7.0.1),一切都会正常工作。

如果安装了最新版的Xcode后仍然无法正常运行,请尝试以以下方式安装gem:

sudo gem install -n /usr/local/bin GEM_NAME_HERE
例如:
sudo gem install -n /usr/local/bin fakes3
sudo gem install -n /usr/local/bin compass
sudo gem install -n /usr/local/bin susy

10

升级到OS X El Capitain后,/usr/local目录会以多种方式进行修改:

  1. 用户权限被重置(这也会对使用Homebrew的人造成问题)
  2. 二进制文件和符号链接可能已被删除或更改

[编辑] 还有一件预备工作要做:升级Xcode...

#1 的解决方案:

$ sudo chown -R $(whoami):admin /usr/local

这将修复/usr/local目录的权限,从而有助于使gem installbrew install|link|...命令正常工作。

#2解决方案:

基于Ruby的问题

确保您已经修复了/usr/local目录的权限(参见上面的 #1)

首先尝试使用以下命令重新安装您的gem:

sudo gem install <gemname>

请注意,它将安装指定 gem 的最新版本。

如果您不想面临向后兼容问题,建议您首先确定要获取哪个 gem 的哪个版本,然后使用 -v version 重新安装它。请看下面的示例,以确保系统不会获取 capistrano 的新版本。

$ gem list | grep capistrano
capistrano (3.4.0, 3.2.1, 2.14.2)
$ sudo gem install capistrano -v 3.4.0

基于Brew的问题

更新Brew并升级您的配方

$ brew update
$ brew upgrade

你可能还需要手动重新链接其中的一些。

$ brew link <formula>

3

正如所说,这个问题源于Mac OSX从“El Capitan”开始的安全功能。

使用系统默认的Ruby,安装过程发生在/Library/Ruby/Gems/2.0.0目录中,该目录对用户不可用并会导致错误。

您可以使用以下命令查看Ruby环境参数:

$ gem env

有一个安装目录和一个用户安装目录。为了使用用户安装目录而不是默认的安装目录,您可以使用--user-install参数,而不是使用sudo,这从来都不是一种推荐的做法。

$ gem install myGemName --user-install

在这个过程中不应该再有任何权限问题。然后把宝石(gems)安装在用户目录下:~/.gem/Ruby/2.0.0/bin。但是为了让安装的宝石(gems)可用,这个目录应该在你的路径中可用。根据Ruby FAQ,你可以将以下行添加到~/.bash_profile~/.bashrc中。
if which ruby >/dev/null && which gem >/dev/null; then
    PATH="$(ruby -rubygems -e 'puts Gem.user_dir')/bin:$PATH"
fi

然后关闭并重新加载终端或重新加载您的.bash_profile.bashrc. ~/.bash_profile


2
这是我使用的解决方案:
注意:此修复程序适用于Compass,因为我在另一个SO问题上编写了它,但我已经使用相同的过程将功能恢复到所有终端进程中,显然,您安装的gems不同,但过程是相同的。
我遇到了同样的问题。这是由于苹果实施了系统完整性保护(SIP)所致。您必须先禁用它...
在恢复模式下重新启动:
重新启动并按住Command + R,直到看到苹果标志。
启动后,从顶部菜单中选择“实用工具>终端”。
输入:csrutil disable 然后输入:reboot
一旦重新启动
重新打开终端并输入以下命令:
sudo gem uninstall bundler sudo gem install bundler sudo gem install compass
sudo gem install sass
sudo gem update --system
需要修复失败的各个gem,因此对于每个gem,执行以下操作:
在我的机器上,这是第一个无法正常工作的依赖项,所以我列出了它:

sudo gem pristine ffi --version 1.9.3

继续处理需要修复的宝石列表。 总共需要大约10分钟来修复它,但您将可以使用compass的终端命令。

屏幕截图


2
如果您正在尝试安装需要 XML 库的 gem,请尝试以下方法:
sudo gem install -n /usr/local/bin  <gem_name> -- --use-system-libraries --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib/

具体来说,在安装nokogiri gem v1.6.8时,我在OS X El Capitan上遇到了问题。

最终,以下方法对我有效:

sudo gem install -n /usr/local/bin  nokogiri -- --use-system-libraries --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib/

为确保您已安装libxml2和libxslt,可以执行以下操作:
brew install libxml2 libxslt
brew install libiconv

然后检查确保您已安装Xcode命令行工具:

xcode-select --install 

应该返回此错误:
xcode-select: error: command line tools are already installed, use "Software Update" to install updates

1
重新安装 RVM 对我有用,但之后我不得不重新安装所有的宝石(gems):
rvm implode
\curl -sSL https://get.rvm.io | bash -s stable --ruby
rvm reload

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