仅在执行时运行方法的命令行脚本?

时间:2013-06-30 09:57:52

标签: ruby command-line

我正在为命令行使用构建一个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/myapppath/to/lib/myapp.rb,所以我想知道最好的方法是检测模块是直接需要还是直接调用。我甚至这样做了吗?我是一个Ruby新手。 : - )

1 个答案:

答案 0 :(得分:0)

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