你没有 /var/lib/gems/2.3.0 目录的写入权限。

180

我在我的Ubuntu 16.04上安装了Ruby。

$which ruby  

/usr/bin/ruby

$ruby -v 

ruby 2.3.0p0 (2015-12-25) [x86_64-linux-gnu]

$gem install bundler 

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

对于评论3:软件包“python-software-properties”不可用,您应该替换为“software-properties-common”。 - Francisco Pedraza
1
RVM选项,甚至更好和更简单地作为纯“用户安装”(而不是全局的、要求权限的安装),可能比调整权限更好! - Frank N
16
我希望您能说明为什么这位OP会出现这个问题,以及为什么应该放弃某个Ruby版本,转而使用多版本安装管理器(RVM或RBEVN)。我无法确定此处的建议是否仅基于个人偏好。我希望这些建议有更深入的原因解释。 - BaldEagle
5
使用命令 sudo gem install bundler 安装 Bundler。 - user2023370
回到这个问题6年后,使用apt安装的ruby v 2.7进行工作时,我在安装minitest gem时遇到了同样的错误,但是尽管如此,在$HOME下创建了一个.gem目录,并且其中有minitest...它可以正常工作。这是什么魔法? - dhanshreeA
显示剩余2条评论
13个回答

249

首先,您需要卸载由Ubuntu安装的Ruby,可以使用类似于sudo apt-get remove ruby的命令。

然后,根据rbenvruby-build的文档重新安装Ruby:

cd $HOME
sudo apt-get update 
sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev libffi-dev

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL

rbenv install 2.3.1
rbenv global 2.3.1
ruby -v

最后一步是安装Bundler:

gem install bundler
rbenv rehash

12
如何安装 Ruby(on Rails)的说明在此处 https://gorails.com/setup/ubuntu/16.04 - Andrzej Rehmann
10
我有些犹豫要进行卸载,因为这需要卸载依赖程序(例如vim-gnome)。我想我更想知道为什么需要在用户安装时写入/var/lib/...。是不是我不必要地执行了sudo gem install - PlasmaBinturong
7
我同意 @AntonSkovorodko 的观点,如果回答能够证明卸载 Ruby 的必要性,那将是很好的。 - blong
4
在 Cinnamon 环境中卸载 Ruby 时要小心(在 Linux Mint 18.2 中发生过),因为重启后可能无法以图形模式运行系统。如果遇到这种情况,请通过 Ctrl+Alt+F1 进入 CLI,并运行以下命令(卸载并重新安装 Cinnamon):sudo apt purge cinnamon && sudo apt install cinnamon - Kout
5
随着时间的推移,您可能希望了解最新可用版本:使用 rbenv install -l 命令列出所有可用版本,然后使用 rbenv install 2.5.1 安装 2.5.1 版本或您想要的其他版本。 - Paul Sturm
显示剩余11条评论

124

如果您想使用分发版Ruby而不是rb-env/rvm,您可以为当前用户设置GEM_HOME。首先创建一个目录来存储您的用户的Ruby gems:

$ mkdir ~/.ruby

然后更新您的 shell,将该目录用于 GEM_HOME 并更新您的 PATH 变量以包括 Ruby gem 二进制文件的目录。

$ echo 'export GEM_HOME=~/.ruby/' >> ~/.bashrc
$ echo 'export PATH="$PATH:~/.ruby/bin"' >> ~/.bashrc
$ source ~/.bashrc

(那最后一行会重新加载当前shell中的环境变量。)

现在你应该能够使用gem命令在你的用户下安装Ruby gems了。我已经在Ubuntu 18.04下成功地将其与Ruby 2.5.1配合使用。如果您使用的不是Bash shell,则需要编辑该shell的启动脚本而不是bashrc


4
我这样做后,遇到了一个“找不到Ruby头文件”的错误,然后我读了这个文章:https://dev59.com/yW855IYBdhLWcg3wfUjQ#4502672 ,虽然没完全照着做,但我执行了sudo apt install ruby-gems命令,然后它就可以工作了。 - robm
2
我相信@robm的意思是ruby-dev而不是ruby-gems。 - Altreus
4
这可能更适合于不需要同时开发多个版本的 Ruby 用户。 - danielcooperxyz
1
你描述了一个非常好的Linux方法来修复我的Ruby安装,而不需要任何额外的工具,只需使用老式的Bash :) - Denis Trofimov
非常感谢!这绝对是一个清晰简洁的解决方案!但是,我建议不要使用 ~/.bashrc 文件,而是写入 ~/.profile 文件,这将允许使用不仅仅是 Bash 特定的脚本和终端(如果您必须使用 /bin/sh 脚本,则尤其如此)。~/.bashrc 正好用于调整 Bash,而不是所有 shell 或环境。 - oneastok
鱼友们应该查看这个答案 stackoverflow.com/a/73835179/12911698 - Tarik Waleed

48

(2019年1月)若要使用Rbenv脚本安装Ruby,请按照以下步骤操作:

1. 首先,更新软件包索引并安装用于ruby-build工具从源代码编译Ruby所需的软件包:

sudo apt-get remove ruby
sudo apt update
sudo apt install git curl libssl-dev libreadline-dev zlib1g-dev autoconf bison build-essential libyaml-dev libreadline-dev libncurses5-dev libffi-dev libgdbm-dev

2. 接下来,运行以下curl命令安装rbenv和ruby-build:

curl -sL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-installer | bash -

3. 将 $HOME/.rbenv/bin 添加到系统 PATH 中。

如果您使用的是 Bash,请运行:

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

如果你正在使用 Zsh,请运行:

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc

4. 安装最新稳定版本的Ruby,并将其设置为默认版本:

rbenv install 2.5.1
rbenv global 2.5.1

列出所有可用的Ruby版本可以使用:rbenv install -l

5. 通过打印版本号来验证Ruby是否已正确安装:

ruby -v

# Output
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

SOURCE: 如何在Ubuntu 18.04上安装Ruby

编辑:安装rubygems:

sudo apt-get install rubygems

2
太好了!非常简洁明了。我完全按照您的步骤操作(除了手动更改.zshrc之外),一切都运行得很完美。就像您添加如何安装rubygems一样,我建议也可以添加如何更新已安装的Ruby版本(我猜只需再次运行rbenv installrbenv global命令,以及可能使用rbenv uninstall来清理过时的版本)。 - gMale
1
太棒了!在Ubuntu 18.04 WSL上完美运行。 - robe007
1
这是更优雅的答案。 - rashedcs
为什么我需要单独安装 rubygems 包?这不是随 ruby 一起发布的吗? - Muhammed Bera Koç

30

Ubuntu 20.04:

选项1-为您的用户帐户设置宝石安装目录

对于bash(对于zsh,我们当然会使用.zshrc

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

选项2 - 使用snap

卸载apt版本的(ruby-full),并使用snap重新安装它。

sudo apt-get remove ruby
sudo snap install ruby --classic

我正在遵循选项2。 - raf
选项2在WSL中不起作用,而选项1可以。 - Felix Dombek

28

而不是更改所有者,可能会锁定其他本地用户或 - 有一天 - 您自己的Ruby服务器/部署事项...在不同的用户下运行...

我宁愿将该特定文件夹的权限简单地扩展给......嗯,每个人:

cd /var/lib
sudo chmod -R a+w gems/

(我也遇到了你的错误,所以这是相当可靠的。)


4
我也需要处理 /usr/local/bin 文件夹,但是这个解决方案不起作用: "错误: 在执行 gem ... (Gem::FilePermissionError) 时, 你没有 /usr/local/bin 目录的写权限。" - eb80
比bashrc破烂和虚拟环境好多了,这是一个全局解决方案。 - undefined

10

我在GitHub Actions中遇到了相同的错误。添加sudo解决了此问题。

sudo gem install bundler

3
不应使用 sudo 安装这些框架。 - ZGski

9
尝试在var/lib/gems目录上使用chown -R,将所有权分配给用户[在本示例中为rubyusername],即将安装和开发gems的用户。
 # chown -R rubyusername:rubyusername /var/lib/gems 

这个命令递归地更改gems目录下的所有内容。为了在多用户系统中提供额外的安全性,您还可以创建一个组来代替对单个ruby用户名的chown操作,并将用户添加到该组中。


3
它可以解决那个问题,但出现了另一个问题: 错误:执行 gem 时... (Gem::FilePermissionError) 对于 /usr/local/bin 目录,您没有写入权限 ; 因此我猜测除了权限之外还有其他问题。 - derek
我后面遇到了其他错误 错误:无法构建本地扩展宝石。 - Brad

4

在Derek上面的回答基础上,通常不建议使用系统提供的Ruby实例进行开发工作,因为系统工具可能依赖于特定版本或Ruby安装位置。类似于这个Mac OSX的答案,您需要按照Derek的说明使用像rbenv这样的东西(RVM是一种类似的替代方案)来安装自己的Ruby实例。

然而,没有必要卸载系统版本的Ruby,rbenv安装说明提供了一种机制,确保在您的shell中可用的Ruby实例是rbenv实例,而不是系统实例。 这就是

echo 'eval "$(rbenv init -)"' >> ~/.bashrc

2

使用snap版本的Ruby解决了我的问题:

  • 删除默认版本:sudo apt-get remove ruby

  • 使用snap安装另一个版本:sudo snap install ruby --classic

  • 现在您可以运行gem install bundler


1

重新安装Compass对我有用。这简直是魔法!

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

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