我正在运行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
<snip>
但是如果正确的安装,ruby和gem路径在这里显示为什么ruby试图将宝石安装到/home/mark/.gem
? env
显示的所有变量和路径看起来都是正确的,我在系统的任何地方都找不到可能包含冲突路径设置的.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
的响应 - 只是为了控制此帖子的大小 - 删除与X,GNOME和SSH相关的所有条目。
答案 0 :(得分:7)
跟踪运行gem install -V --backtrace --debug haml
的回溯(感谢zzzhc)并仔细查看/home/mark/.gem
目录,我发现那里没有安装gems,只有gemspec文件和gem源文件。本着实验的精神,我删除了/home/mark/.gem
并重新运行了gem install
命令,突然它正在运行。它已经为我刚刚安装的宝石重新创建了包含gemspec的/home/mark/.gem
。
现在我很清楚我在原问题中误解了错误信息;尝试将gems安装到/home/mark/.gem
时,rubygems没有失败,它只是将该目录用作即将安装的新下载的gems的gemspec的临时存储。在安装rvm之前,我一直在使用sudo gem install...
将gems安装到系统上,这将创建具有root权限的/home/mark/.gem
目录。因此,没有rubygems
的{{1}}运行无法访问临时目录以存储gemspecs并且在安装gems之前正在中止。卫生署!
答案 1 :(得分:1)
另一种方法是在进入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工作正常。
答案 2 :(得分:0)
检查/home/mark/.rvm/rubies/ruby-1.9.2-p0/bin/gem
的第一行并查看http://yehudakatz.com/2010/08/24/a-tale-of-abort-traps-or-always-question-your-assumptions/