2013-06-30 33 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测试或其他脚本需要时运行。