RVM — Не может использовать драгоценные камни из @global gemset

#rubygems #rvm

#rubygems #rvm

Вопрос:

У меня проблема с RVM. Обычно я использую наборы драгоценных камней для конкретного проекта; однако недавно, когда я устанавливаю драгоценный камень в @global gemset, он недоступен, когда я работаю в определенном проекте. Вот пример, в котором я пытался установить драгоценный камень hpricot. Это происходит сразу после установки драгоценного камня и запуска новой оболочки.

 $ rvm use ruby-1.9.2
Using /home/bshaver/.rvm/gems/ruby-1.9.2-p180

$ gem list

*** LOCAL GEMS ***

bundler (1.0.12)
hpricot (0.8.4)
rake (0.8.7)

$ rvm use ruby-1.9.2@myproject-gems
Using /home/bshaver/.rvm/gems/ruby-1.9.2-p180 with gemset myproject-gems

$ gem list | grep hpricot

$ rvm info

ruby-1.9.2-p180@myproject-gems:

  system:
uname:       "Linux hawkeye.localdomain 2.6.35.12-88.fc14.x86_64 #1 SMP Thu Mar 31 21:21:57 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux"
bash:        "/bin/bash => GNU bash, version 4.1.7(1)-release (x86_64-redhat-linux-gnu)"
zsh:         " => not installed"

  rvm:
version:      "rvm 1.5.2 by Wayne E. Seguin (wayneeseguin@gmail.com) [http://rvm.beginrescueend.com/]"

  ruby:
interpreter:  "ruby"
version:      "1.9.2p180"
date:         "2011-02-18"
platform:     "x86_64-linux"
patchlevel:   "2011-02-18 revision 30909"
full_version: "ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]"

  homes:
gem:          "/home/bshaver/.rvm/gems/ruby-1.9.2-p180@myproject-gems"
ruby:         "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180"

  binaries:
ruby:         "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180/bin/ruby"
irb:          "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180/bin/irb"
gem:          "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180/bin/gem"
rake:         "/home/bshaver/.rvm/gems/ruby-1.9.2-p180@global/bin/rake"

  environment:
PATH:         "/home/bshaver/.rvm/gems/ruby-1.9.2-p180@myproject-gems/bin:/home/bshaver/.rvm/gems/ruby-1.9.2-p180@global/bin:/home/bshaver/.rvm/rubies/ruby-1.9.2-p180/bin:/home/bshaver/.rvm/bin:/usr/local/java/bin:/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/real/RealPlayer/:/home/bshaver/bin:/home/bshaver/test-root/bin:/home/bshaver/Documents/scripts/"
GEM_HOME:     "/home/bshaver/.rvm/gems/ruby-1.9.2-p180@myproject-gems"

GEM_PATH:     "/home/bshaver/.rvm/gems/ruby-1.9.2-p180@myproject-gems:/home/bshaver/.rvm/gems/ruby-1.9.2-p180@global"
MY_RUBY_HOME: "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180"
IRBRC:        "/home/bshaver/.rvm/rubies/ruby-1.9.2-p180/.irbrc"
RUBYOPT:      ""
gemset:       "myproject-gems"
  

Есть идеи, почему hpricot не был бы доступен внутри project gemset? У меня тоже была такая же проблема с bundler, но в итоге я снова установил его в gemset.

Спасибо..

Ответ №1:

Проблема здесь в том, что я не использовал @ global gemset при первой установке hpricot gem.

Существует разница между gemset интерпретатора по умолчанию и gemset @global для этого интерпретатора.

Таким образом, вы можете достичь желаемого результата с помощью

 $ rvm use ruby-1.9.2@global
Using /home/bshaver/.rvm/gems/ruby-1.9.2-p180 with gemset global

$ gem install validation_refelection
Fetching: validation_reflection-1.0.0.gem (100%)
Successfully installed validation_reflection-1.0.0
1 gem installed
Installing ri documentation for validation_reflection-1.0.0...
Installing RDoc documentation for validation_reflection-1.0.0...

$ rvm use ruby-1.9.2@myproject-gems
Using /home/bshaver/.rvm/gems/ruby-1.9.2-p180 with gemset myproject-gems

$ gem list | grep validation_reflection
validation_reflection (1.0.0)
  

И драгоценный камень доступен проекту по желанию.

Ответ №2:

Я столкнулся с тем же самым и немного поэкспериментировал

 $ gem list

...
tzinfo (0.3.29, 0.3.28)
uglifier (1.0.0)
wirble (0.1.3)
  

Затем в консоли отладчика (требуется gem ruby-debug для ruby 1.8.7 или ruby-debug19 для ruby 1.9.2):

 ruby-1.9.2-p180 :001 > puts `gem list`  #note that those are not quotes, but backticks

...
tzinfo (0.3.28)
wirble (0.1.3)
 => nil 
  

Все, что указано в gem list , было драгоценным камнем из gemfile или одной из его зависимостей. Я полагаю, что Rails вызывает Bundler для создания контекста gem перед запуском приложения. Мне нужно больше читать, чтобы быть уверенным в этом, но, похоже, это так.

Итак, для вашей ситуации добавьте gem 'hpricot' в свой gemfile, и вы сможете использовать его в контексте проекта.

Комментарии:

1. Спасибо Эрику за ответ. Если я правильно понимаю, что вы говорите, у меня это не работает. Когда я добавляю ‘hpricot’ в Gemfile, тогда он должен передать bundle check , но он возвращается с сообщением, что зависимости вашего Gemfile не могут быть удовлетворены , даже если отсутствующий gem установлен где -то в GEM_PATH.

2. Вам все равно придется запустить bundle install после добавления этого в ваш gemfile. Я полагаю, что bundler создает отдельный контекст для каждого проекта и будет проверять только эти папки. Драгоценные камни, установленные с gem install <gemname> , недоступны, пока вы не поместите их в gemfile и не запустите bundle install .

3. Ах, но запуск bundle install устанавливает второй экземпляр недостающих драгоценных камней в набор драгоценных камней для конкретного проекта. Согласно ссылке на RVM, @global должен разрешать совместное использование единственной копии драгоценного камня между проектами. Однако, пока я искал, чтобы найти 2 каталога, в которых устанавливался мой gem, ответ появился сам собой, поскольку первый каталог установки не находился в @ global gemset.