我正在构建一个供命令行使用的 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
,并打印出__FILE__
和$0
变量分别给我bin/myapp
和path/to/lib/myapp.rb
,所以我想知道最好的方法是检测模块是需要还是直接调用。我这样做对吗?我是一个红宝石新手。:-)