【问题标题】:Should rbenv be installed system-wide, or at a user level?rbenv 应该在系统范围内安装,还是在用户级别安装?
【发布时间】:2016-01-15 11:07:45
【问题描述】:

我正在构建一个 vagrant 设置,其中一部分是安装 rbenv。我正在使用 librarian-chef 来管理我所有的厨师食谱,它会安装 rbenv 和 ruby​​-build。

但是,当我尝试 ssh 进入我的 Vagrant VM 并输入 ruby -v 时,我得到了标准系统安装的 ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]。想到可能没有安装rbenv,我尝试运行rbenv versions,但实际上已经安装了rbenv:

vagrant@precise64:~$ rbenv versions
* system (set by /opt/rbenv/version)

然后我尝试了rbenv install [version]

vagrant@precise64:~$ rbenv install 1.9.3-p327
[...]

BUILD FAILED
[...]

test -z "/opt/rbenv/versions/1.9.3-p327/include" || /bin/mkdir -p "/opt/rbenv/versions/1.9.3-p327/include"
/bin/mkdir: cannot create directory `/opt/rbenv/versions/1.9.3-p327': Permission denied

Permission denied 失败了。我尝试使用sudo 再次安装:

sudo rbenv install 1.9.3-p327

这很奏效。然后我再次尝试运行rbenv versions

vagrant@precise64:~$ rbenv versions
* system (set by /opt/rbenv/version)

但它仍然说只安装了system ruby​​。但是,如果我使用sudo 运行它:

vagrant@precise64:~$ sudo rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  1.9.3-p327

rbenv versions 现在显示 1.9.3 已安装。

所以似乎存在脱节,因为 rbenv 和我的 ruby​​ 版本现在安装在系统级别而不是用户级别。

我正在使用rbenv-cookbook。我想用 chef 设置 rbenv,因为这样我就不用在安装后手动设置它了。

我遇到的另一个问题是,似乎所有受 ruby​​ 控制的东西(例如 gem)也在遭受同样的断开连接。

vagrant@precise64:~$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the /opt/vagrant_ruby/lib/ruby/gems/1.8 directory.

【问题讨论】:

    标签: ruby rubygems chef-infra vagrant rbenv


    【解决方案1】:

    rbenv 应该安装在用户级别。

    不幸的是,这意味着在运行gem install 时,您可能会遇到您看到的问题:

    You don't have write permissions into the {...} directory
    

    您可以通过在~/.rbenv 目录上设置正确的权限来解决此问题。

    sudo chown -R yourusername ~/.rbenv
    

    chown目录之后,您将能够在没有sudo 的情况下运行gem install

    【讨论】:

      【解决方案2】:

      大约两年前,一个关于共享安装的discussion happened in github 似乎回答了这个问题。

      概要:sstephenson(rbenv 作者)特别不喜欢鼓励系统范围的安装,因为权限、写访问等的复杂性。他认为添加强大的支持会使 rbenv 更加复杂,并且简单是目标。

      编辑

      我从那以后遇到了 fnichol 的 chef-rbenv 食谱,如果你真的想安装一个系统范围的 rbenv,它会给出一个 right and proper method,你可以用 Chef 自动化它(我推荐刀单人)。

      它将它安装到/etc/profile.d/,因此它将为所有用户运行,putting the proper ruby into the PATH

      【讨论】:

      • 对于未来的人 - this method 到 rbenv 安装到 /usr/local/rbenv 有效。如果您使用的是 zsh,则需要将 . /etc/profile 添加到 /etc/zsh/zprofile 以包含在该方法中创建的 /etc/profile.d/rbenv.sh 文件。
      【解决方案3】:

      rbenv 的自述文件中的所有内容都假定在 ~/.rbenv/ 中进行本地(每个用户)安装,所以我认为官方建议是在每个用户的基础上安装它。

      仍然可以在全局范围内安装它。但是对于所有需要写入权限的命令,您都需要sudo。安装新的 rubies、安装 gems* 和更改全局 ruby​​ 版本是我想到的,可能还有更多。

      (*) 当您通过默认系统例程(如 debian 上的 apt)安装 ruby​​ 时,默认需要 sudo 来安装新 gem,不需要 sudo 因为它实际上是使用 ruby​​ 版本管理器的积极副作用每个用户的基础

      【讨论】:

      • 这篇文章有说明:blakewilliams.me/blog/4-system-wide-rbenv-install 还将组更改为人员并给予组权限 + 设置粘性位,因此您应该能够安装和使用任何用户的 rubies。我不确定这是否被推荐,也不确定为什么或为什么不推荐。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 2020-01-05
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多