如果没有sudo,Bundler无法安装任何宝石

时间:2013-05-04 17:23:06

标签: ruby-on-rails ruby macos bundler osx-mountain-lion

我正在尝试安装rails应用,每次使用bundle时都会失败sudo。我目前的情况是,只要使用{{1>} 所有,包括rails,一切正常。我不认为这是正确的。

例如:

sudo

但后来我按照它说的做了它并且有效:

$ bundle update
Updating git://github.com/refinery/refinerycms.git
Fetching gem metadata from https://rubygems.org/.......
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Enter your password to install the bundled RubyGems to your system: 
Using rake (10.0.4) 
Using i18n (0.6.1) 
Using multi_json (1.7.2) 
Using rack-cache (1.2) 
Using rack-test (0.6.2) 
Installing hike (1.2.2) 
Errno::EACCES: Permission denied - /usr/local/rvm/gems/ruby-1.9.3-p194/build_info/hike-1.2.2.info
An error occurred while installing hike (1.2.2), and Bundler cannot continue.
Make sure that `gem install hike -v '1.2.2'` succeeds before bundling.

对于不同的宝石,这种模式一次又一次地重复。我不明白。为什么会这样?如果我使用$ gem install hike -v '1.2.2' Successfully installed hike-1.2.2 Parsing documentation for hike-1.2.2 Installing ri documentation for hike-1.2.2 Done installing documentation for hike after 0 seconds 1 gem installed 捆绑包将更新而不会出现此错误。但目前的情况是,我需要sudo来处理所有内容,包括sudorake...等。有些事情不对。

其他细节:我在OSX 10.8.3 ......

rails server

更新

我可以提供$ ruby -v ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0] $ gem -v 2.0.3 $ rvm -v rvm 1.19.6 (stable) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/] $ which ruby /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby $ which gem /usr/local/rvm/rubies/ruby-1.9.3-p194/bin/gem $ which rvm /usr/local/rvm/bin/rvm 无错误的信息。然后在sudo bundle install失败后立即出现上述错误。这是为什么?

UPDATE2

bundle install

8 个答案:

答案 0 :(得分:51)

您可以在用户主文件夹中托管不需要root权限的宝石:

bundle install --path ~/.gem

为避免传递此参数,请手动将export GEM_HOME=$HOME/.gem添加到.bash_profile - 这解决了Mac OS和其他* nix系统上的sudo问题。然后,您可能还需要访问提供可执行文件的gem(例如bundler),所以也要添加它:

PATH=$PATH:$HOME/.gem/bin

或在某些情况下:

PATH=$PATH:$HOME/.gem/ruby/<version>/bin

参考:https://stackoverflow.com/a/5862327/322020


UPD:但请记住,如果您开始使用具有此环境变量的rbenv相同可能会在使用太多不同版本的Ruby时导致问题,因此您可能希望临时unset GEM_HOME或每次添加自定义一个你启动了rbenv-ed Ruby。

答案 1 :(得分:18)

您的RVM gem目录应归rvm组所有。因此,简单地将用户添加到rvm组:

,而不是更改所有权
# $(whoami) evaluates to your username
# You may want to change this to a different username depending on your config
# but $(whoami) is a passable default
usermod -a -G rvm $(whoami)

答案 2 :(得分:7)

这是因为您安装ruby的方式。

坦率地说,如果你不介意sudo,那就好了*。在一天结束时,它只是你的笔记本电脑......不是某个服务器在银行运行。

如果你真的在乎,可以根据需要选择gem文件夹。

答案 3 :(得分:2)

我今天发生了这件事。这可能是一种独特的情况,但我从一个全局安装了RVM的系统(/usr/local/rvm中的系统范围内)复制了一个Rails源代码树,这个系统只是每个用户安装了一个RVM({{1 }})。

我正在尝试~/.rvm并获取“您的用户帐户不允许安装到系统Rubygems”。错误。经过大量的探索之后,我注意到在我的bundle install目录中有一个符号链接:

~/.rvm

删除该符号链接后~/.rvm/gems/ruby-2.1.1/cache -> /usr/local/rvm/gems/cache 再次使用bundle install

答案 4 :(得分:2)

tl; dr;

对于1.16.1

cd $HOME
bundle config path ~/.gem/ruby
cd my_project
bundle install

对于2.1.4 -除了运行Bundler之后创建符号链接,我找不到其他方法。

对于2.2.0 -逻辑changed,但除了运行Bundler之后创建符号链接,我仍然找不到其他方法。

替代-您可以尝试gem install -g

说明:

事实证明,在某个时候(我猜git blame可以显示它,但是我懒得检查),bundler停止了以兼容的方式在用户本地gem目录中以用户身份安装gem。 gem install

那是

  • gem install安装在~/.gem/ruby/gems/gemname-gemversion
  • bundle install尝试始终安装到系统目录,并且需要sudo
  • bundle install --path ~/.gem安装在~/.gem/ruby/2.5.0/gems/gemname-gemversion / btw下,由于捆绑程序2.x /
  • ,此标志似乎已被弃用

没有文档说明如何要求在gem所在的同一位置安装gem的原始行为。甚至文档表明情况已经如此。

因此,查看 .../gems/bundler-2.1.4/lib/bundler/settings.rb .../gems/bundler-1.16.1/lib/bundler/settings.rb的来源,我们可以观察到这颗宝石(双关语):

    # for legacy reasons, the ruby scope isnt appended when the setting comes from ENV or the global config,
    # nor do we respect :disable_shared_gems
    def path
      key  = key_for(:path)
      path = ENV[key] || @global_config[key]
      if path && !@temporary.key?(key) && !@local_config.key?(key)
        return Path.new(path, false, false, false)
      end

      system_path = self["path.system"] || (self[:disable_shared_gems] == false)
      Path.new(self[:path], true, system_path, Bundler.feature_flag.default_install_uses_path?)
    end

因此,我们正在看第if path && !@temporary.key?(key) && !@local_config.key?(key)行。这意味着必须设置path,但不能在临时标志(我猜为--path)中,也不能在项目本地配置中。这意味着在用户全局配置中或作为环境变量。

这就是为什么我们需要离开项目目录并将设置设置为默认情况下具有的值的原因。但是,看到用户全局配置中存在此密钥,将bundler的行为更改为在没有gem的情况下为用户本地安装与sudo兼容的行为。

cd
bundle config path ~/.gem/ruby

感谢关注。

答案 5 :(得分:1)

我遇到了同样的问题,并在安装新gems之前发现Bundler是否对所有找到$ GEM_HOME / build_info的文件都有写权限。在我的情况下它没有,因为虽然运行bundler的用户在'rvm'用户组中,并且该组拥有所有这些文件,但是不允许组写一些文件。

之所以发生这种情况是因为我在root下安装了一些gems,其中包含umask 0022(由root创建的所有文件,不能由group编写),而不是其他人拥有的umask 0002以及rvm期望的那些。

答案 6 :(得分:0)

如果您使用的是RVM,那么请执行以下两个步骤,这将是金色的

  1. 确保您的用户属于RVM组

    sudo usermod -a -G rvm myUserName

  2. 确保build_info对RVM组中的所有用户都是可写的

    sudo chmod 664 $GEM_HOME/build_info/*

答案 7 :(得分:0)

对此的最佳解决方案似乎是使用rbenv如下安装ruby-

rvm -v 
rvm list
rvm uninstall {version_to_uninstall}
rvm use system - Switch to macOS default ruby version
rvm implode - uninstall rvm 

rbenv - Ruby Environment Manager - we will use this to install ruby
brew install rbenv ruby-build
rbenv install 2.6.0

Add the following line to .bash_profile - 
if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi

source ~/.bash_profile
rbenv global 2.6.0
ruby -v 

运行rbenv rehash

rm -rf rbenv root /shims
rbenv rehash

最终运行-

bundle install