2016-01-19 35 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從我的寶石文件夾中,不需要依賴關係:

$ 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本身列出的寶石是。

此外,即使它們直接包含在Gemfile中,也可能不需要包含在某些Bundler組中的gems(如'development'),但您需要告訴bundler需要默認組以外的組。

儘管您可以手動使用require寶石,但也可以使用require 'rails'Bundle.require對於Gemfile中的每個寶石(或者至少是Gemfile中的默認組)都不會做任何事情,只有require gem,它除了查找Gemfile中的所有寶石並且需要它們之外,還在做任何其他的魔法。一些人認爲,Bundle.require無論如何都被認爲是不好的做法,你應該只需要你需要的文件的依賴關係。雖然Rails不同意,並且Rails應用程序有自己的一些複雜的自動加載方式。

但是,如果你是在一個Rails應用程序中,就像你的示例依賴關係所表明的那樣......你爲什麼要自己做require 'bundler/setup'Bundle.require,儘管不是讓Rails啓動過程來照顧它嗎? Rails啓動過程會照顧到你需要的Bundler組(例如Rails.env == 'development'中的「開發」組)。

可以直接像你在做的那樣使用打包器API,這並不難。但Rails通常會爲你處理這個問題,如果你使用Rails,rails可能已經完成了作爲Rails引導過程一部分的Bundler.setupBundler.require

+0

感謝您的迴應!我正在開發一個可以使用和不使用Rails的gem,上面的問題與非Rails gem使用有關,這就是爲什麼我在使用'Bundler.require'。我覺得手動需要寶石而不是僅僅使用Bundler是很奇怪的。爲什麼這不是最佳做法?另外,'Bundler.require'將需要來自默認組的gems,這是'gemspec'放置'gem_dependency' gem的組。所以我不知道爲什麼這些寶石沒有被Bundler正確要求。 – linkyndy

相關問題