在Ubuntu上的rvm下的ruby gems(未能)安装在错误的位置

我正在运行Ubuntu 10.04并且最初安装了ruby 1.9.1(来自源代码)。 我刚刚决定尝试使用ruby 1.9.2和rails 3,这似乎是使用rvm来处理多个ruby安装和gemsets的好时机。

安装了rvm并且似乎正在工作,我在rvm中安装了ruby 1.9.2并将其作为我的默认ruby。 但是,每当我尝试在ruby 1.9.2下安装gem时,我都会看到此错误。

mark@Steve-Austins-Penguin:~$ gem install haml ERROR: While executing gem ... (Errno::EACCES) Permission denied - /home/mark/.gem/specs 

gem environment回归:

 RubyGems Environment: - RUBYGEMS VERSION: 1.3.7 - RUBY VERSION: 1.9.2 (2010-08-18 patchlevel 0) [x86_64-linux] - INSTALLATION DIRECTORY: /home/mark/.rvm/gems/ruby-1.9.2-p0 - RUBY EXECUTABLE: /home/mark/.rvm/rubies/ruby-1.9.2-p0/bin/ruby - EXECUTABLE DIRECTORY: /home/mark/.rvm/gems/ruby-1.9.2-p0/bin - RUBYGEMS PLATFORMS: - ruby - x86_64-linux - GEM PATHS: - /home/mark/.rvm/gems/ruby-1.9.2-p0 - /home/mark/.rvm/gems/ruby-1.9.2-p0@global  

但是如果正确的安装,ruby和gem路径在这里显示为什么ruby试图将gem安装到/home/mark/.gemenv显示的所有变量和路径看起来都是正确的,我在系统的任何地方都找不到可能包含冲突路径设置的.gemrc文件。

所以我想我的问题是什么可能导致rubygems尝试安装到/home/mark/.gems而不是由rvm设置的正确路径?


针对以下问题:

 mark@Steve-Austins-Penguin:~$ echo $PATH /home/mark/.rvm/gems/ruby-1.9.2-p0/bin:/home/mark/.rvm/gems/ruby-1.9.2-p0@global/bin:/home/mark/.rvm/rubies/ruby-1.9.2-p0/bin:/home/mark/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games mark@Steve-Austins-Penguin:~$ which gem /home/mark/.rvm/rubies/ruby-1.9.2-p0/bin/gem mark@Steve-Austins-Penguin:~$ rvm list rvm rubies ruby-1.8.7-p302 [ x86_64 ] => ruby-1.9.2-p0 [ x86_64 ] mark@Steve-Austins-Penguin:~$ env rvm_gemsets_path=/home/mark/.rvm/gemsets MANPATH=:/home/mark/.rvm/man rvm_scripts_path=/home/mark/.rvm/scripts rvm_bin_path=/home/mark/.rvm/bin GEM_HOME=/home/mark/.rvm/gems/ruby-1.9.2-p0 rvm_patchsets_path=/home/mark/.rvm/patchsets SHELL=/bin/bash IRBRC=/home/mark/.rvm/rubies/ruby-1.9.2-p0/.irbrc rvm_patches_path=/home/mark/.rvm/patches MY_RUBY_HOME=/home/mark/.rvm/rubies/ruby-1.9.2-p0 rvm_selfcontained=1 USER=mark __shell_array_start=0 rvm_gems_cache_path=/home/mark/.rvm/gems/cache rvm_config_path=/home/mark/.rvm/config rvm_path=/home/mark/.rvm USERNAME=mark rvm_gemset_separator=@ rvm_ruby_args= rvm_rubies_path=/home/mark/.rvm/rubies PWD=/home/mark rvm_hooks_path=/home/mark/.rvm/hooks rvm_version=1.0.1 rvm_src_path=/home/mark/.rvm/src HOME=/home/mark rvm_gems_path=/home/mark/.rvm/gems rvm_ruby_string=ruby-1.9.2-p0 BUNDLE_PATH=/home/mark/.rvm/gems/ruby-1.9.2-p0 rvm_tmp_path=/home/mark/.rvm/tmp LOGNAME=mark GEM_PATH=/home/mark/.rvm/gems/ruby-1.9.2-p0:/home/mark/.rvm/gems/ruby-1.9.2-p0@global rvm_action=list rvm_log_path=/home/mark/.rvm/log rvm_interactive=1 RUBY_VERSION=ruby-1.9.2-p0 rvm_archives_path=/home/mark/.rvm/archives rvm_repo_path=/home/mark/.rvm/repos _=/usr/bin/env 

请注意,我已经略微编辑了env的响应 – 只是为了控制此post的大小 – 删除与X,GNOME和SSH相关的所有条目。

跟踪运行gem install -V --backtrace --debug haml (感谢zzzhc)的回溯并仔细查看/home/mark/.gem目录,我发现那里没有安装gems,只有gemspec文件和gem源文件。 本着实验的精神,我删除了/home/mark/.gem并重新运行了gem install命令,突然它正在运行。 并且它已经重新创建了/home/mark/.gem其中包含我刚刚安装的gems的gemspecs。

现在很清楚,我在原始问题中误解了错误信息; 尝试将gem安装到/home/mark/.gem ,rubygems没有失败,它只是使用该目录作为即将安装的新下载的gems的gemspecs的临时存储。 在安装rvm之前,我一直在使用sudo gem install...将gems安装到系统上sudo gem install...这将创建具有root权限的/home/mark/.gem目录。 因此没有sudo运行的rubygems无法访问临时目录以存储gemspecs并且在它可以安装gems之前中止。 卫生署!

另一种方法是在进入ruby版本后输入gem。 你会得到这样的东西 – /home/username/.rvm/rubies/ruby-1.9.2-p180/bin/gem 。 现在只需输入sudo /home/username/.rvm/rubies/ruby-1.9.2-p180/bin/gem install gem_name

指定完整路径并添加sudo工作正常。

检查/home/mark/.rvm/rubies/ruby-1.9.2-p0/bin/gem的第一行并查看http://yehudakatz.com/2010/08/24/a-tale-of-abort -traps或-总是个问题-你-假设/