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

使用多个文件创建Ruby Main(命令行实用程序)程序,ruby,Ruby,我正在尝试使用gem制作命令行实用程序。这是在最近的Ruby Rogues播客中介绍的 如果我将所有代码放在一个文件中并需要该文件,那么rspec会给我一个错误,因为主dsl将rpsec视为主实用程序的命令行调用 我可以将一个方法分解成一个新文件,并让rspec需要该文件。假设您有此程序,但希望将do_something方法放在单独的文件中,以使用rspec进行测试: require 'main' def do_something(foo) puts "foo is #{foo}" end

我正在尝试使用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命令行程序的便捷方式是什么?也许可以创建一个gem?

您正处于正确的测试轨道上-基本上您希望您的“逻辑”在单独的文件中,这样您就可以对它们进行单元测试。然后,您可以使用类似这样的方法进行集成测试

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

  • 将可执行文件放入
    bin
  • 将文件放入
    lib/your_APP/whatever.rb
    中,其中“your_APP”是应用程序的名称。我还建议使用为应用程序命名的模块为类命名
  • 在可执行文件中,需要
    lib
    中的文件,就像
    lib
    在加载路径中一样
  • 在您的gempec中,确保指出您的bin文件和lib文件是什么(如果您使用
    bundle gem
    生成它并使用git,您应该可以开始了)

这样,当安装RubyGems时,您的应用程序将在运行时访问
lib
中的文件。在开发过程中,您需要执行
bundle exec-bin/my_-app
RUBYLIB=lib-bin/my_-app
。关键是,RubyGems在运行时负责加载路径,而不是在开发时。

您在测试方面走的是正确的道路——基本上,您希望您的“逻辑”在单独的文件中,以便您可以对它们进行单元测试。然后,您可以使用类似这样的方法进行集成测试

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

  • 将可执行文件放入
    bin
  • 将文件放入
    lib/your_APP/whatever.rb
    中,其中“your_APP”是应用程序的名称。我还建议使用为应用程序命名的模块为类命名
  • 在可执行文件中,需要
    lib
    中的文件,就像
    lib
    在加载路径中一样
  • 在您的gempec中,确保指出您的bin文件和lib文件是什么(如果您使用
    bundle gem
    生成它并使用git,您应该可以开始了)
这样,当安装RubyGems时,您的应用程序将在运行时访问
lib
中的文件。在开发过程中,您需要执行
bundle exec-bin/my_-app
RUBYLIB=lib-bin/my_-app
。关键是,RubyGems在运行时负责加载路径,而不是在开发时