2013-06-30 36 views
0

我正在爲命令行使用創建一個gem,我知道if __FILE__ == $0方法用於確定正在運行的文件是否是當前文件(來自Run code only if script called from the command line),但這在我的情況下不起作用。我有一個具有初始化函數的模塊,我希望在從命令行調用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測試我的應用程序,並打印出來的那一刻__FILE__$0變量分別給我bin/myapppath/to/lib/myapp.rb,所以我想最好的辦法就是檢測是否被要求或直接調用該模塊是什麼。我是否做對了?我是一個Ruby新手。 :-)

+0

'無論模塊是需要還是直接調用'而不是什麼? – sawa

+0

不清楚'initialize函數返回錯誤是什麼意思,因爲沒有從命令行發送參數。 – sawa

+0

我已經更新了這個問題,以澄清。 – Ben

回答

0

終於明白了這一點。而不是在lib/myapp.rb中運行MyApp:initialize,我把它放在bin/myapp文件中。這確保了它只能在應用程序從命令行運行時運行,而不是在通過Rake測試或其他腳本需要時運行。