Ruby on rails 没有sudo,Bundler无法安装任何gems

Ruby on rails 没有sudo,Bundler无法安装任何gems,ruby-on-rails,ruby,macos,bundler,osx-mountain-lion,Ruby On Rails,Ruby,Macos,Bundler,Osx Mountain Lion,我正在尝试安装一个rails应用程序,每次使用bundle时,如果没有sudo,它都会失败。我目前的情况是,只要对所有东西使用sudo,包括rails,所有东西都可以工作。我认为这是不对的 例如: $ bundle update Updating git://github.com/refinery/refinerycms.git Fetching gem metadata from https://rubygems.org/....... Fetching gem metadata from h

我正在尝试安装一个rails应用程序,每次使用
bundle
时,如果没有
sudo
,它都会失败。我目前的情况是,只要对所有东西使用
sudo
,包括rails,所有东西都可以工作。我认为这是不对的

例如:

$ 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
bundle将在没有此错误的情况下更新。但目前的情况是,我需要
sudo
来处理所有事情,包括
rake…
rails服务器
,等等。有些事情不对劲

其他详细信息:我在OSX 10.8.3上

$ 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

这是由于您安装ruby的方式

坦白地说,如果你不介意sudo的话,它很好用。在一天结束时,它只是你的笔记本电脑。。。不是银行里的服务器


如果您真的在意,请根据需要查看gem文件夹。

您的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)

我也遇到了同样的问题,在安装新的gems之前,我发现Bundler会检查它是否对所有找到的$GEM\u HOME/build\u info文件具有写入权限。在我的例子中并没有,因为尽管运行bundler的用户在“rvm”用户组中,并且该组拥有所有这些文件,但该组不允许写入其中的一些文件


这是因为我在root下安装了一些gems,它有umask 0022(所有由root创建的文件,不能由组写入),而不是其他人有的umask 0002,这也是rvm所期望的。

我今天就这样做了。这可能是一种独特的情况,但我已经将Rails源代码树从一个全局安装了RVM的系统(在
/usr/local/RVM
中的系统范围)复制到了一个每个用户只安装了RVM的系统(
~/.RVM

我试图进行
捆绑安装
并获得“您的用户帐户不允许安装到系统Rubygems。”错误。经过多次摸索,我注意到在我的
~/.rvm
目录中有一个符号链接:

~/.rvm/gems/ruby-2.1.1/cache -> /usr/local/rvm/gems/cache

删除该符号链接使
bundle安装
在没有
sudo
的情况下重新工作

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

cd
bundle config path ~/.gem/ruby
bundle安装——路径~/.gem

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

PATH=$PATH:$HOME/.gem/bin
或者在某些情况下:

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

参考:



UPD:但请记住,如果您开始使用rbenv,那么使用太多不同版本的Ruby时,此环境变量相同可能会导致问题,因此您可能希望在每次启动rbenv ed Ruby时临时
取消GEM_HOME
或预先设置自定义一个,然后做这两个步骤,你将是金色的

  • 确保您的用户属于RVM组

    sudo usermod-a-G rvm myUserName

  • 确保RVM组中的所有用户都可以写入build_信息

    sudo chmod 664$GEM\u HOME/build\u info/*


  • 最好的修复方法似乎是使用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

    rm -rf rbenv root /shims
    rbenv rehash
    
    最后运行-

    bundle install
    

    tl;博士

    适用于1.16.1

    cd $HOME
    bundle config path ~/.gem/ruby
    cd my_project
    bundle install
    
    对于2.1.4-除了在运行Bundler后创建符号链接外,我找不到其他方法

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

    备选方案-您可以尝试
    gem安装-g

    说明:

    事实证明,在某个时刻(我想git Dull可以说明这一点,但我懒得去检查),
    bundler
    停止以用户身份在用户本地gem目录中以兼容的方式安装gem,以
    gem install

    这意味着

    • gem安装
      安装在
      ~/.gem/ruby/gems/gemname gemversion
    • bundle安装
      尝试始终安装到系统目录,需要
      sudo
    • bundle安装--path~/.gem
      安装在
      ~/.gem/ruby/2.5.0/gems/gemname gemversion
      /btw下。由于bundler 2.x,此标志似乎已被弃用/
    没有文档说明如何请求在
    gem
    所在的同一位置安装gem的原始行为。即使是文件也表明情况已经如此

    因此,查看
    ../gems/bundler-2.1.4/lib/bundler/settings.rb
    ../gems/bundler-1.16.1/lib/bundler/settings.rb的源代码,我们可以观察到这个gem(双关语):

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

    这就是为什么我们需要跳出项目目录并将设置设置为默认值的原因。但是在用户全局配置中看到此键会改变
    bundler
    的行为,从而在不使用
    sudo
    的情况下,将兼容
    gem
    的软件安装到用户本地

    cd
    bundle config path ~/.gem/ruby
    

    感谢您的关注。

    我以为我是使用rvm安装Ruby的,但我是一个完全的n00b,所以我可能会感到困惑。你能详细说明一下如何浏览gem文件夹吗?它们在哪里?
    cd/path/to/gems
    。然后是
    sudo chown-R username:groupname*
    ,其中username和groupname是您自己的(在我的系统中,这将是
    cd
    bundle config path ~/.gem/ruby