#ruby-on-rails #ruby #bundler
#ruby-on-rails #ruby #bundler
Вопрос:
У меня установлены Rails 3.0.10 и 3.1, потому что я пытаюсь использовать оба для двух разных проектов.
В моем проекте Rails 3.0.10 у меня есть следующее в верхней части моего Gemfile:
gem 'rails', '3.0.10'
Однако после запуска bundle install; bundle exec rails --version
я получаю следующее:
/Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:31:in `setup': You have already activated activesupport 3.1.1, but your Gemfile requires activesupport 3.0.10. Using bundle exec may solve this. (Gem::LoadError)
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/runtime.rb:17:in `setup'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler.rb:110:in `setup'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/cli.rb:340:in `exec'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/vendor/thor/task.rb:22:in `send'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/vendor/thor/task.rb:22:in `run'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/vendor/thor/invocation.rb:118:in `invoke_task'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/vendor/thor.rb:263:in `dispatch'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/lib/bundler/vendor/thor/base.rb:386:in `start'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/lib/ruby/gems/1.8/gems/bundler-1.0.21/bin/bundle:13
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/bin/bundle:19:in `load'
from /Users/bradley/.rbenv/versions/ree-1.8.7-2011.03/bin/bundle:19
Есть идеи? Очевидно, что я уже использую bundle exec
и bundle show rails; bundle show activesupport
подтверждаю, что я должен использовать правильные версии gems. Мне просто нужно удалить Rails 3.1?
Комментарии:
1. Вы пытаетесь писать в Gemfile
gem 'activesupport', '3.0.10'
?2. Да, я тоже это пробовал. По какой-то причине он все еще пытается загрузить 3.1.
3. Можете ли вы добавить содержимое вашего Gemfile? Возможно, что один из ваших gems зависит от activesupport и загружается в версии 3.1.1
4. Конечно, вот
Gemfile
иGemfile.lock
5. Есть идеи? Я попытался вручную изменить все ссылки на
active support
иactivesupport (>= 2.3.x)
в моем Gemfile. блокировка должна быть(~> 3.0.10)
но, похоже, это не помогло.
Ответ №1:
Я столкнулся с той же проблемой.
Даже когда я явно указываю версию activesupport для использования в моем Gemfile:
gem 'rails', '3.2.9'
gem 'activesupport', '3.2.9'
это все еще выдает мне эту ошибку при запуске bundle exec rails s
:
/home/tyler/.rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.0.18/lib/bundler/runtime.rb:31:in `block in setup':
You have already activated activesupport 3.2.10, but your Gemfile requires activesupport 3.2.9. Consider using bundle exec. (Gem::LoadError)
Это происходит со мной, когда я хочу попробовать вернуться к более старой версии Rails в моем приложении, чтобы проверить разницу между двумя версиями Rails.
Таким образом, даже создание отдельного gemset для моего приложения (что мы обычно делаем в любом случае) не решает проблему, потому что gemset был «загрязнен» самим этим приложением (путем временной установки / использования Rails 3.2.10 перед возвратом к Rails 3.2.9), а не каким-либо другим приложением!
Единственное решение, которое я нашел до сих пор, — это удалить более новую версию, которую вы не хотите использовать:
gem uninstall activesupport -v 3.2.10
Похоже, что это либо ошибка в Bundler, либо ошибка в Rails (если это делает что-то, что заставляет activesupport загружаться / активироваться до загрузки Bundler, тогда мы не можем винить в этом Bundler …).
Другое не менее ужасное решение: чтобы временно не удаляя ее, вы можете отредактировать файл спецификации gem (например, /home/tyler/.rvm/gems/ruby-1.9.3-p194/specifications/activesupport-3.2.10.gemspec
) и добавить строку raise 'disabled'
вверху. Bundler пропустит загрузку activesupport 3.2.10
(после восстановления и печати ошибки) и перейдет к загрузке следующей самой высокой версии activesupport
, которую он сможет найти ( activesupport 3.2.9
).
Когда вы будете готовы повторно включить activesupport 3.2.10
, просто удалите raise
.
Это может быть быстрее, чем удаление и переустановка gem, если вы просто хотите протестировать что-то с более старой версией, прежде чем вернуться к более новой версии их gem.
Комментарии:
1. Спасибо за подтверждение. Я думал, что я был единственным. Я склоняюсь к ошибке Rails, поскольку, похоже, это происходит до загрузки bundler.
2. Сегодня это случилось со мной снова. Мне нужно было вернуться в прошлое с помощью git (ознакомьтесь с более ранней версией моего приложения), чтобы попытаться отследить регрессию, и, конечно, с тех пор я обновил activesupport, поэтому мне пришлось удалить activesupport -v 3.1.3 из gem, прежде чем я смог запустить cucumber. // Я тоже склоняюсь к ошибке Rails. Хотелось бы, чтобы bundler выдал ошибку получше, сообщающую вам, где * / *как была активирована более новая версия. «Вы уже активировали activesupport 3.1.3 здесь: [полная обратная трассировка, показывающая, что сработало для активации]» Тогда мы могли бы мгновенно узнать, какая строка в Rails была проблемой.
Ответ №2:
В моем файле gem я изменил версию rails на свою текущую версию:
gem ‘rails’, ‘3.2.2’
Я выполнил команду: обновление пакета
И ошибка исчезает
Ответ №3:
Создайте файл ‘.rvmrc’ в каждом каталоге RAILS_ROOT (таким образом, в корне каждого проекта)
заполните его:
vm_install_on_use_flag=1
rvm_gemset_create_on_use_flag=1
rvm use ruby-1.9.2-p290@APPNAME
где APPNAME отличается для каждого приложения. Извлеките компакт-диск из каталога приложений, а затем снова вставьте. При подключении компакт-диска скажите «да» на доверие набору gem. Затем запустите Bundle install в каждом из них.
Вы создали 2 набора драгоценных камней, по одному для каждого проекта, поэтому перекрестного опыления приложений не происходит. Это должно устранить проблемы.
Комментарии:
1. Я только что переключился с RVM на RBEnv. Я думал, что весь смысл bundler в том, чтобы избегать создания таких вещей, как наборы драгоценных камней.
2. Нет, их совместное использование создает изолированные среды для ваших приложений. хорошо иметь наборы драгоценных камней: bcardarella.com/post/699582642/rvm-gemsets-bundler-awesome
3. Но если целью bundler является загрузка соответствующих зависимостей gem для моего проекта, зачем мне нужен набор gem? Я определенно понимаю использование rvm или rbenv для управления различными версиями ruby. Похоже, что Bundler должен загрузить правильную версию activesupport для моей версии rails.
4. Это должно …. но тогда есть драгоценные камни, которые указывают версию другого драгоценного камня, превышающую 2. что в то время было нормально, но теперь версия 4 несовместима. Итак, у вас есть 2 и 4 в вашей системе, но явно не говорите, что хотите загрузить 2.
5. Bundler загружает драгоценные камни в gemset / environment… это не указывает вашему приложению, какие из них использовать конкретно. Иногда, если вы явно не указываете, что хотите использовать определенную версию, обычно используется последняя версия, найденная в системе.
Ответ №4:
Это может быть неправильным, но, пожалуйста, используйте Ruby Version Manager (RVM).
Это позволит вам управлять несколькими установками версий ruby, а также так называемыми наборами драгоценных камней, которые позволяют вам поддерживать глобальные репозитории для всех ваших драгоценных камней (также разные версии для каждого драгоценного камня) и устанавливать, какой из них вы хотите использовать в любой момент времени.
Помимо всего этого, посмотрите на очистку установленных вами драгоценных камней и начните заново:
gem clean -d # dry mode will simply tell you what will get cleaned
gem clean -v # will remove all older versions of every single gem
Кроме этого, вы можете принудительно удалить rails gem вместе с его зависимостями (вы можете проверить, какие зависимости есть в вашей версии rails)
gem uninstall actionmailer actionpack activerecord activesupport acriveresource rails -v=3.1.0
Надеюсь, это поможет. Приветствия!