您没有/var/lib/gems/2.3.0目录的写权限

时间:2016-06-09 08:39:54

标签: rubygems gem-bundler

我在我的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.

任何帮助将不胜感激!

11 个答案:

答案 0 :(得分:122)

首先需要使用sudo apt-get remove ruby之类的东西卸载Ubuntu安装的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 libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties 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

然后享受!

德里克

答案 1 :(得分:18)

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

$ mkdir ~/.ruby

然后更新shell以将该目录用于GEM_HOME并更新PATH变量以包含Ruby gem bin目录。

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

(最后一行会将设置直接加载到当前shell中。)

现在,您应该能够使用gem命令在您的用户下安装Ruby gem。我能够在Ubuntu 18.04下使用Ruby 2.5.1。如果您使用的是非Bash的shell,则需要编辑该shell的启动脚本而不是bashrc

答案 2 :(得分:8)

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

 # chown -R rubyusername:rubyusername /var/lib/gems 

递归会更改 gems 目录下的所有内容。为了在多用户系统上获得额外的安全性,您还可以创建一个组,而不是使用单个rubyusername,并将用户添加到该组。

答案 3 :(得分:8)

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

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

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

(我确实遇到了你的错误。所以这是相当经过验证的。)

答案 4 :(得分:6)

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

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

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/master/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]

来源:How To Install Ruby on Ubuntu 18.04

编辑:安装rubygems:

sudo apt-get install rubygems

答案 5 :(得分:5)

Ubuntu 20.04:

选项1-为您的用户帐户设置一个gem安装目录

对于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-使用捕捉

卸载apt-version(ruby-full),然后使用snap

重新安装。
sudo apt-get remove ruby
sudo snap install ruby --classic

答案 6 :(得分:3)

基于derek上面的答案,通常不建议将系统提供的Ruby实例用于您自己的开发工作,因为系统工具可能依赖于Ruby安装的特定版本或位置。与this answer for Mac OSX类似,您需要遵循derek关于使用类似rbenv(RVM是类似替代方法)的说明来安装您自己的Ruby实例。

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

echo 'eval "$(rbenv init -)"' >> ~/.bashrc
在德里克的回答中说道。

答案 7 :(得分:3)

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

sudo gem install bundler

答案 8 :(得分:1)

重新安装Compass对我有用。这真是神奇!

package com.muddco.fl04;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.util.Log;
import android.widget.Toast;

import com.muddco.fl04.R;

public class MainActivity extends AppCompatActivity {

    static String TAG = "TEST123";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        openFile();
    }

    // Request code for selecting a PDF document.
    private static final int PICK_FILE = 2;

    private void openFile() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");

        startActivityForResult(intent, PICK_FILE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode,
                                 Intent resultData) {
        if (requestCode == PICK_FILE
                && resultCode == Activity.RESULT_OK) {
            Uri uri = null;
            if (resultData != null) {
                uri = resultData.getData();
                dumpImageMetaData(uri);
            }
        }
        super.onActivityResult(requestCode,resultCode,resultData);
    }

    public void dumpImageMetaData(Uri uri) {

        Cursor cursor = getApplicationContext().getContentResolver()
                .query(uri, null, null, null, null, null);

        try {
            if (cursor != null && cursor.moveToFirst()) {

                // Note it's called "Display Name". This is
                // provider-specific, and might not necessarily be the file name.
                String displayName = cursor.getString(
                        cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                Log.i(TAG, "Display Name: " + displayName);

                int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
              String size = null;
                if (!cursor.isNull(sizeIndex)) {
                   size = cursor.getString(sizeIndex);
                } else {
                    size = "Unknown";
                }
                Log.i(TAG, "Size: " + size);
                Toast.makeText(this, "Display Name: " + displayName + " Size: " + size, Toast.LENGTH_LONG).show();
            }
        } finally {
            cursor.close();
        }
    }
}

答案 9 :(得分:0)

对我来说,这个问题只是在此bash命令的前面简单添加 sudo 即可。

gem install rails -v 5.2.3

应该如此

sudo gem install rails -v 5.2.3

答案 10 :(得分:0)

您是否在安装 bundler 之前尝试运行 rbenv rehash

我使用运行 Ubuntu 20.04 的 WSL2 遇到了这个问题。

我通过 GitHub 安装了 rbenv 和 ruby​​-build,然后继续安装 ruby​​ 3.0.1 并将其设置为全局版本。

➜  ~ rbenv install 3.0.1
Downloading ruby-3.0.1.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.1.tar.gz
Installing ruby-3.0.1...
Installed ruby-3.0.1 to /home/kayla/.rbenv/versions/3.0.1
➜  ~ rbenv global 3.0.1
➜  ~ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
➜  ~ gem install bundler
Fetching bundler-2.2.20.gem
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /var/lib/gems/2.7.0 directory.

我的 ruby​​ 安装在同一个位置:

➜  ~ which ruby
/usr/bin/ruby

我不需要完全重新安装 rbenv 和 ruby​​-build,而是在安装 bundler 之前重新哈希:

➜  ~ rbenv rehash
➜  ~ gem install bundler
Fetching bundler-2.2.20.gem
Successfully installed bundler-2.2.20
Parsing documentation for bundler-2.2.20
Installing ri documentation for bundler-2.2.20
Done installing documentation for bundler after 3 seconds
1 gem installed

之前可能暗示过这一点的一个线索是,在我重新散列之前 ruby -v 的返回值是 ruby​​ 2.7.0,而不是 3.0.1。