【问题标题】:Using rbenv doesn't work with sudo?使用 rbenv 不适用于 sudo?
【发布时间】:2013-10-04 23:02:22
【问题描述】:

任何使用 sudo 的命令似乎都不适用于 RBenv。

我正在尝试安装 ActiveRecord,但它说我没有写权限,所以当我尝试这个时:

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the /usr/local/rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1 directory.

上面写着:

sudo: gem: command not found

我该如何解决这个问题?

【问题讨论】:

  • 看起来您已将 rbenv 安装在 /usr/local/rbenv 而不是 ~/.rbenv。如果您安装在用户的主目录中,您将获得更好的权限。

标签: ruby ubuntu rbenv


【解决方案1】:

rbenv 和 RVM 等工具背后的理念是您不需要使用sudo,因为您的整个 Ruby 环境作为沙箱存在于您自己的工作空间中。

尽管 RVM 最初是为单用户设计的,但它允许多用户配置。

据我所见或读到,rbenv 仅适用于单用户。在使用 rbenv 时,您在任何时候都不需要使用 sudo 来操作或更改您的 Ruby 环境。如果你这样做了,那就错了。如果你尝试使用sudo,你会搞砸的。您可能不会立即发现,但最终会弹出一些内容,您需要将文件的所有权更改回给您。

在 Linux 和 Mac OS 上,您可以很容易地做到这一点:

sudo chown -R <your_user_name>:<your_group> ~/.rbenv

您必须以sudo 运行它,因为只有超级用户才能更改root 拥有的文件的所有权。 sudo 提升您的权限以允许您更改这些内容。

【讨论】:

  • 即使你有一个沙箱,有时你也会想要使用 sudo。例如,您想使用由 rbenv 管理的 Ruby 作为 gem 安装的 chef-solo。在 RVM 中,您可以使用 rvmsudo 来执行此类操作。我正在寻找 rbenv 的替代品。
  • 人们使用sudo rvm ...sudo rbenv ...,这与rvmsudo不同。前两个会导致各种问题。这就是这个问题和答案的内容。
【解决方案2】:

我意识到这现在有点过时了,但这可能会对将来的人们有所帮助:

rbenv-sudo 是一个 rbenv 插件,允许您在 sudo 会话中运行 rbenv 提供的 Rubies 和 Gems。

https://github.com/dcarley/rbenv-sudo

【讨论】:

  • 更好的主意:sudo env PATH=$PATH bundle exec ...
【解决方案3】:

我在“Installing Ruby 2.0 and Rails 4.0.0beta on AWS EC2”中的回答可能对你有用。

简而言之,root 用户需要在其环境中加载 rbenv 才能使用 rbenv 安装的 gem。这可以通过添加以下内容来完成

# /etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="${RBENV_ROOT}/bin:$PATH"
eval "$(rbenv init -)"

这应该足以让sudo 工作。如果你正在编写一个 shell 脚本,你可能需要使用

. /etc/profile.d/rbenv.sh 

在使用其他 gem 的可执行文件之前。

【讨论】:

  • 这种方法的一个问题是,当“rbenv init -”被评估为 root 用户时,它会修改 rbenv/shims 目录并通过这样做将所有权更改为 root。然后,当用户运行相同的命令时,它将因权限被拒绝错误而失败。以 root 身份安装 ruby​​ 版本和/或 gems 时会出现类似问题。
【解决方案4】:

我的回答有点晚了,但我对此问题有简单的解决方案。使用符号链接可以使用 binstubs 和其他 Ruby 内容。

ln -s ~/.rbenv/bin/rbenv /usr/local/bin/rbenv
ln -s ~/.rbenv/shims/* /usr/local/bin

我希望这对遇到相同问题的其他用户有所帮助。

【讨论】:

  • rbenv 管理创建指向由 gems 创建的可执行文件的链接。见github.com/rbenv/rbenv#rbenv-rehash。如果 rbenv 设置正确,则根本不需要将链接放在 /usr/local 中,因为 PATH 应该指向正确的位置。
猜你喜欢
  • 2015-03-19
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多