使用多个文件创建Ruby Main(命令行实用程序)程序

时间:2013-06-15 22:01:09

标签: ruby

我正在尝试使用main gem来创建命令行实用程序。这是在最近的Ruby Rogues播客中提出的。

如果我将所有代码放在一个文件中并且需要该文件,那么rspec会给我一个错误,因为主dsl将rpsec视为主实用程序的命令行调用。

我可以将方法分解为新文件并让rspec需要该文件。假设你有这个程序,但是想把do_something方法放在一个单独的文件中用rspec来测试:

require 'main'

def do_something(foo)
  puts "foo is #{foo}"
end    

Main {
  argument('foo'){
    required                    # this is the default
    cast :int                   # value cast to Fixnum
    validate{|foo| foo == 42}   # raises error in failure case 
    description 'the foo param' # shown in --help
  }
  do_something(arguments['foo'].value)   
}

使用多个文件分发/部署ruby命令行程序的便捷方法是什么?也许创造一个宝石?

1 个答案:

答案 0 :(得分:1)

您正在进行正确的测试 - 基本上您希望将“逻辑”放在单独的文件中,以便对其进行单元测试。然后,您可以使用Aruba之类的东西进行集成测试。

对于多个文件,最好的办法是将其作为RubyGem分发。那里有很多资源,但它的要点是:

  • 将您的可执行文件放入bin
  • 将您的文件放在lib/YOUR_APP/whatever.rb中,其中“YOUR_APP”是您应用的名称。我还建议使用为您的应用命名的模块命名您的类的名称
  • 在您的可执行文件中,要求lib中的文件,好像lib位于加载路径中
  • 在你的gemspec中,确保指出你的bin文件是什么以及你的lib文件是什么(如果你使用bundle gem生成它并使用git,你应该很高兴去)

这样,您的应用程序可以在运行时访问lib中的文件,使用RubyGems 时可以访问。在开发过程中,您需要执行bundle exec bin/my_appRUBYLIB=lib bin/my_app。重点是,RubyGems在运行时处理加载路径,但不在开发时处理。