2016-07-04 8 views
1

私は、バンドラーがどのように動作するかを理解しようとするために、いろいろなことをやっています。私はちょうど3私の作業ディレクトリ内のファイルがあります。必要なgemがGemfileにあるとしたら、 `bundle exec ruby​​ [file]`でNameErrorを取得するのはなぜですか?

Gemfile Gemfile.lock test.rb

をすべてGemfileがありgem "slop"あるとtest.rbは次のようになります。

puts Slop.parse

私はbundle exec test.rbを実行すると、私はNameErrorによるものを得ますrequireの声明を持たない:

[[email protected]xx my_app]$ bundle exec ruby test.rb 
test.rb:1:in `<main>': uninitialized constant Slop (NameError) 

しかし、私はbundle consoleを実行した場合、バンドラーが正しく宝石をロードし、私は明示的にrequire "slop"を入力せずにコンソールからSlop.parseを実行することができます。

[[email protected] my_app]$ bundle console 
irb(main):001:0> Slop.parse 
=> #<Slop::Result:0x00000001339838... 

だから私は何をしないのですか?私はrequire: falseが私のGemfileにないので、bundle exec ruby test.rbを実行したときにSlopをロードして、ファイルにrequire "slop"行を入れる必要はないはずです。

答えて

3

あなたはこのようなあなたのGemfile上のすべての宝石を必要とするバンドラを設定へ必要があります。

require 'rubygems' 
require 'bundler/setup' 
Bundler.require(:default) 

http://bundler.io/v1.12/bundler_setup.html

0

でドキュメントをチェックし、私は私がrequire: falseを持っていないので、という印象の下にありました 私のGemfileでは、バンドルexec ruby​​ test.rb を実行するとSlopをロードする必要があり、ファイルに必要な "slop"行を入れる必要はありません。

bundler docsは言う:

は、プロジェクトのルートにGemfileにあなたの依存関係を指定します。あなたのアプリ内

source 'https://rubygems.org' 

gem 'nokogiri' #<======HERE 

を、バンドルされた環境を読み込みます:

このためとして
require 'rubygems' 
require 'bundler/setup' 

# require your gems as usual 
require 'nokogiri' #<========AND HERE 

私は でrequire: false私のGemfileを持っていないので、私は、バンドルのexecルビー・テストを実行すると、スロップがロードされなければならないという印象の下にありました。 rb と私はファイルに必要な "スロープ"行を配置する必要はありません。

この時点では、bundlerドキュメントは恐ろしいものです。私が知る限り、:require => falseはRails固有のもので、プロジェクトの起動時の読み込み時間を短縮するために使用されます。 レールアプリで、require: falseと指定すると、gemが手動で宝石を要求するまでロードされません。 :require => falseを指定しないと、宝石は自動的にロードされますが、それは、レールコードがその自動ロードを行うように書かれているからです。あなたのアプリには、同様の機能を実行するコードはありません。

編集:テスト中に間違ってしまった。だからそれは動作する方法です:非レールアプリで

:require => falseを指定します。ここでは細かい文字で

Bundler.require :default 

Bundler docs言及:あなたは自動的にあなたのGemfileに指定されているすべての宝石を必要とする場合、あなたのtest.rbで、次のように記述する必要がありますバンドラーが という宝石を必要としないようにするには、まだそれをインストールし、依存関係を維持してください。

gem 'rspec', :require => false 
gem 'sqlite3' 

あなたのGemfileで宝石を必要とするためには、あなたのアプリケーションでBundler.requireを呼び出す必要があります。

その要件は唯一の代わりに、冒頭に述べたことのrequire: falseと一緒に言及された理由私はわかりません。

そして、あなたのGemfileで指定した場合:

gem 'slop', :require => false 

(だけでなく、test.rbでBundler.require :default)を、その後、あなたはまた、明示的test.rbでスロップの宝石を必要とする必要があります。

require 'slop' 

つまり、Bundler.require :defaultは、require: falseと記された宝石を除いて、自動的にあなたのGemfile内のすべての宝石を必要とします。 require: falseと記された宝石については、あなたのアプリに手動でrequire 'gem_name'と書かなければなりません。

したがって、ネオイドが正しい解決策を投稿しました。あなたのGemfileに


*、あなたはどのようにBundler.require()作品に影響を与えグループでの巣の宝石を、することができます。 Bundler docs on groupsを参照してください。

+0

ないアイデアを「スロップ」を必要としない追加する必要があります – sixty4bit

-2

これが最初にdownvotedされましたが、私は1を与えられ、徹底をお願いしました、なぜあなたはあなたのtest.rb内

関連する問題