我正在为命令行使用构建一个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
时,它会调用initialize函数,该函数返回错误:
/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/myapp
和path/to/lib/myapp.rb
,所以我想知道最好的方法是检测模块是直接需要还是直接调用。我甚至这样做了吗?我是一个Ruby新手。 : - )
答案 0 :(得分:0)
终于弄明白了。我没有在MyApp:initialize
中运行lib/myapp.rb
,而是将其放在bin/myapp
文件中。这可以确保它仅在从命令行运行应用程序时运行,而不是在通过Rake进行测试或其他脚本需要时运行。