require_gem VS gem — не такой уж и устаревший
Илья • 31 мая 2007 г.
require 'rubygems'
require_gem 'activerecord'
p ActiveRecord
Всё ок:
Warning: require_gem is obsolete. Use gem instead.
ActiveRecord
Теперь попробуем то же самое, но вместо require_gem используем метод gem:
require 'rubygems'
gem 'activerecord'
p ActiveRecord
То ничего не работает:
uninitialized constant ActiveRecord::Base (NameError)
Кто может объяснить сей феномен? Использую Ruby 1.8.5, Rubygems 0.9.4.
4 комментария:
Извините, но комментарии для этой статьи уже закрыты.

def gem(gem_name, *version_requirements) active_gem_with_options(gem_name, version_requirements) end # Same as the +gem+ command, but will also require a file if the gem # provides an auto-required file name. # # DEPRECATED! Use +gem+ instead. # def require_gem(gem_name, *version_requirements) file, lineno = location_of_caller warn "#{file}:#{lineno}:Warning: require_gem is obsolete. Use gem instead." active_gem_with_options(gem_name, version_requirements, :auto_require=>true) endвсе дело в :auto_require=>trueЕдинственное отличие gem от require_gem это то, что оно не вызывает autorequire на джемах. Соответсвеннно нужно теперь вызывать самому. Пример для AR:
$ gem specification activerecor|grep autorequire autorequire: active_record $ irb >> require ‘rubygems’ => false >> require ‘active_record’ => true >> ActiveRecord => ActiveRecord >>
que Спасибо, исходник то я и сам догадался прочитать. Меня больше интересует почему они отключили auto_require.
@Илья: Я общался по этому поводу с Чадом и Джимом, поскольку это решение сильно испортило нам жизнь, их мотивировка была, что отказ от autoreqiure помог им закрыть кучу bugs связанных с авотматической загрузкой. Честно говоря аргумент мне показался совсем не убедительным.
Мы продолжаем пользоваться require_gem, просто засунули в config/boot.rb рельсовых приложений это код:
require ‘rubygems’
module Kernel
end if Gem::RubyGemsVersion.split(’.’).map{|v|v.to_i}.extend(Comparable) > [0,9,0]