0

コマンドラインで使用するgemを構築してif __FILE__ == $0います.実行中のファイルが現在のファイルであるかどうかを判断する方法を認識しています(コマンドラインからスクリプトが呼び出された場合にのみコードを実行する)。場合。コマンドラインからgemが呼び出されたときに実行したい初期化関数を含むモジュールがあります。

module MyApp
    def self.initialize
        # do command line stuff
    end
    def self.test
        # run a rake test
    end
end

MyApp::initialize

ただし、実行rake testすると、エラーを返す初期化関数が呼び出されます。

/Library/WebServer/Documents/myapp ❤ rake test
Options:
    -v, --[no-]verbose               Run verbosely
    -h, --help                       Show this message
rake aborted!
Command failed with status (255): [ruby -I"lib" -I"/Users/bbriggs/.rvm/gems/ruby-2.0.0-p195/gems/rake-10.1.0/lib" "/Users/bbriggs/.rvm/gems/ruby-2.0.0-p195/gems/rake-10.1.0/lib/rake/rake_test_loader.rb" "test/test_myapp.rb" ]
/Users/bbriggs/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `eval'
/Users/bbriggs/.rvm/gems/ruby-2.0.0-p195/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => test
(See full trace by running task with --trace)

MyApp:initializeこれは、コードからそれを取り除くと期待どおりに実行されるため、実行しているためだと思いますrake testが、コマンド ライン ツールは機能しなくなります。

現在、私は を介し​​てアプリをテストしており、変数およびbundle exec bin/myappを出力すると、それぞれ および が得られるため、モジュールが必要か直接呼び出されているかを検出する最善の方法は何かと考えていました。私はこれを正しくやっていますか?私はRubyの初心者です。:-)__FILE__$0bin/myapppath/to/lib/myapp.rb

4

1 に答える 1

0

最後にこれを理解しました。MyApp:initialize実行する代わりに、ファイルlib/myapp.rbに入れました。bin/myappこれにより、アプリがコマンド ラインから実行された場合にのみ実行され、Rake を介してテストされている場合や別のスクリプトで必要とされている場合には実行されません。

于 2013-08-05T09:58:48.323 に答える