2016-01-19 5 views
1

Я развиваю драгоценный камень на данный момент. Вот как .gemspec выглядит следующим образом:Почему Bundler.require не требует зависимостей?

gem.add_dependency 'activerecord', '~> 4.2' 
... 

gem.add_development_dependency 'rails', '4.2.5' 
... 

и вот мой Gemfile:

source 'https://rubygems.org' 

gemspec 

Я настраиваю мой главный файл, lib/my_gem.rb так:

module MyGem 
    module Lib 
    end 
end 

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 

require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) 
Bundler.require 

Однако, если я начну bundle console из моей папки gem, зависит от обстоятельств:

$ bundle console 
Resolving dependencies... 
irb(main):001:0> Rails 
NameError: uninitialized constant Rails 
... 
irb(main):002:0> ActiveRecord 
NameError: uninitialized constant ActiveRecord 
... 

Что я делаю неправильно?

ответ

1

Я считаю, что зависимости, включенные через команду gemspec в Gemfile, не требуются автоматически Bundler.require. Только драгоценные камни, перечисленные непосредственно в самом Gemfile.

Кроме того, камни, включенные только в определенные группы Bundler, такие как «разработка», могут не требоваться Bundle.require, даже если они были включены непосредственно в Gemfile, вам нужно сообщить поставщику, что для него требуются другие группы, кроме стандартных.

Вы всегда можете require драгоценных камней вручную, хотя, как require 'rails'. Bundle.require не делает ничего, кроме require gem для каждого драгоценного камня в вашем Gemfile (или, по крайней мере, группы по умолчанию в вашем Gemfile), он делает любую магию, кроме поиска всех драгоценных камней в вашем Gemfile и требующих их. Bundle.require, по мнению некоторых, является плохой практикой в ​​любом случае, вам нужно просто потребовать зависимости, которые вам нужны в файлах, в которых они вам нужны, некоторые говорят. Хотя Rails не согласен, а приложения Rails имеют свой сложный способ автозагрузки.

Но если вы находитесь в приложении Rails, как показывают ваши примеры зависимостей ... почему вы делаете какие-либо require 'bundler/setup' или Bundle.require самостоятельно, но вместо того, чтобы позволить процессу загрузки Rails позаботиться об этом? Процесс загрузки Rails позаботится о том, чтобы вы, вероятно, ожидали группы Bundler (например, группа «development», когда в Rails.env == 'development').

You может использовать спутник api непосредственно, как вы делаете, это не слишком сложно. Но Rails обычно заботится об этом для вас, и если вы используете Rails, рельсы, вероятно, уже сделали Bundler.setup и Bundler.require в рамках процесса загрузки Rails.

+0

Спасибо, что ответили! Я разрабатываю драгоценный камень, который можно использовать с Rails и без него, и вышеупомянутый вопрос связан с использованием не-Rails gem, поэтому я делаю 'Bundler.require'. Мне кажется странным, чтобы вручную требовать драгоценные камни, а не просто использовать Bundler. Почему это не лучшая практика? Кроме того, 'Bundler.require' потребует драгоценных камней из группы по умолчанию, и это группа, где' gemspec' помещает драгоценные камни 'gem_dependency'. Поэтому я не знаю, почему эти драгоценные камни должным образом не требуются Бундлером. – linkyndy

Смежные вопросы