1

我正在寻找gem或了解如何在 Ruby 中优雅地路由 CLI 命令。Thor是我已经在使用的解决方案,从某种意义上说,它允许您构建特定的命令行结构。例子:

person show 1               => Info about person Id 1
person show all             => Show all people
person delete 2             => Delete person with Id 2 

Thor在这方面很棒,我强烈推荐它。现在我需要更多面向语义的 CLI 结构,例如:

show person 1                => Same as 'show person 1'
show people                  => Same as 'show person all'
etc...

Thor不支持这个,所以我需要实现它。我将在 thor 之上构建层,该层将预处理命令并将它们发送给 thor。我正在寻找最好的方法。我希望避免case/when/when.... 谢谢你。

4

4 回答 4

1

我强烈推荐可卡因!https://rubygems.org/gems/cocaine

于 2012-08-16T13:49:05.183 回答
0

一种简单的方法是创建两个可执行文件:一个是您当前的可执行文件person,它实现了所有功能。

第二个可以称为“person-app”之类的东西,并且被设计为符号链接。例如

> ln -s person-app show
> ln -s person-app delete
> whatever else

所以,你现在有几个符号链接到同一个应用程序,person-app. person-app可以通过检查来检测使用了哪个符号链接$0,然后制定调用person

case File.basename($0)
when 'show' then system("person show #{ARGV.join(' ')}")
when 'delete' then system("person delete #{ARGV.join(' ')}")
end

等等。这有点 hacky,但它应该可以工作并将代码重复降至最低。

于 2012-08-17T12:36:46.313 回答
0

试试cliqr https://github.com/anshulverma/cliqr。自述文件有一个很好的用例示例。

于 2015-06-18T17:16:14.317 回答
0

你应该试试console_runner gem。最好的一点是您不需要编写新代码。您可以从命令行执行任何现有的 Ruby 文件。您所需要的只是将注释(类似于 YARD的语法)添加到要使其可执行的 Class 和方法:

# @runnable This tool can talk to you. Run it when you are lonely.
#   Written in Ruby.  
class MyClass

    def initialize
      @hello_msg = 'Hello' 
      @bye_msg = 'Good Bye!' 
    end

    # @runnable Say 'Hello' to you.
    # @param [String] name Your name
    def say_hello(name)
      puts @hello_msg + ', ' + name
    end

    # @runnable Say 'Good Bye' to you.
    def say_bye
      puts @bye_msg
    end

end

gem 将为您生成 CLI 界面。

$ c_run /projects/example/my_class.rb  --help
Options:
  --debug    Run in debug mode.

This tool can talk to you. Run it when you are lonely.
Written in Ruby.

Available actions:
        - say_hello
                Say 'Hello' to you.
        - say_bye
                Say 'Good Bye' to you.

您也可以使用参数。运行MyClass#say_hello

$ c_run /projects/example/my_class.rb say_hello --name 'Yuri'
 -> Hello, Yuri

运行MyClass#say_bye

$ c_run /projects/example/my_class.rb say_bye
 -> Good Bye!
于 2019-04-16T08:47:55.127 回答