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 комментария:

  1. que: 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
  2. Val:

    Единственное отличие gem от require_gem это то, что оно не вызывает autorequire на джемах. Соответсвеннно нужно теперь вызывать самому. Пример для AR:

    $ gem specification activerecor|grep autorequire autorequire: active_record $ irb >> require ‘rubygems’ => false >> require ‘active_record’ => true >> ActiveRecord => ActiveRecord >>

  3. Илья:

    que Спасибо, исходник то я и сам догадался прочитать. Меня больше интересует почему они отключили auto_require.

  4. Val:

    @Илья: Я общался по этому поводу с Чадом и Джимом, поскольку это решение сильно испортило нам жизнь, их мотивировка была, что отказ от autoreqiure помог им закрыть кучу bugs связанных с авотматической загрузкой. Честно говоря аргумент мне показался совсем не убедительным.

    Мы продолжаем пользоваться require_gem, просто засунули в config/boot.rb рельсовых приложений это код:

    require ‘rubygems’

    module Kernel

    def require_gem(gem_name, *version_requirements)
    active_gem_with_options(gem_name, version_requirements, :auto_require => true)
    end

    end if Gem::RubyGemsVersion.split(’.’).map{|v|v.to_i}.extend(Comparable) > [0,9,0]

Извините, но комментарии для этой статьи уже закрыты.