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

4

1 回答 1

0

终于想通了。我没有运行MyApp:initialize,而是lib/myapp.rb将它放在bin/myapp文件中。这确保它仅在应用程序从命令行运行时运行,而不是在通过 Rake 测试或其他脚本需要时运行。

于 2013-08-05T09:58:48.323 回答