创建交互式ruby控制台应用程序

dav*_*puh 14 ruby console interactive

我想制作用户启动它的交互式应用程序,并可以通过键入命令(某种shell)来完成各种任务

例:

./myapp.rb  
App says Hi  
Commands:   
  help - display help about command
  open - open task
  do - do action
Start>help open
  open <TaskName>
  opens specified task
Start>open Something  
Something>do SomeAction
  Success!
Something> (blinking cursor here)
Run Code Online (Sandbox Code Playgroud)

我搜索但找不到任何我可以专门用于控制台互动的红宝石宝石,所以我要自己制作...

我看着托尔,但那不是我想要的,也许我可以用它,但不确定......

它可能看起来像:

class Tasks
  attr_reader :opened_task

  desc "open <TaskName>", "opens specified task"
  def open(params)
  end

  desc "do <ActionName>", "do specified action"
  def do(params)
  end
end

tasks = Tasks.new
# theoretical Console class
console = Console.new
console.addCommand("open",tasks.method(:open),"open task")
console.addCommand("do",tasks.method(:do),"do action")
console.start("%s>",[*tasks.opened_task])
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我可以使用什么宝石制作这样的控制台类?也许有人已经做了类似的事情?我计划使用HighLine输入/输出,但任何其他建议我可以使用什么?

Mat*_*ira 18

你想要的是一个REPL - Read ? Evaluate ? Print Loop.

例如,IRB为Ruby语言实现了一个REPL.

这是应用程序REPL的一个非常简单的实现:

loop do
  Application::Console.prompt.display
  input = gets.chomp
  command, *params = input.split /\s/

  case command
  when /\Ahelp\z/i
    puts Application::Console.help_text
  when /\Aopen\z/i
    Application::Task.open params.first
  when /\Ado\z/i
    Application::Action.perform *params
  else puts 'Invalid command'
  end
end
Run Code Online (Sandbox Code Playgroud)

\A并分别\z匹配字符串的开头和字符串的结尾.

  • 我接受了这个答案,因为它建议通过展示部分实现来自己制作,所以我将自己创建CLI,特别是满足我的所有需求...... (2认同)

Ale*_*ohl 5

你也可以试试ripl.(来自文档):创建和启动自定义shell非常简单:

require 'ripl'
# Define plugins, load files, etc...
Ripl.start
Run Code Online (Sandbox Code Playgroud)

ripl的插件列表以及项目网站上使用ripl的控制台应用程序列表.

  • 说实话,到目前为止我没有使用`ripl` - 但是从头开始编写自己的解决方案似乎并不是最好的主意.只需考虑使用箭头键移动 - 没有readline支持用户将会发誓. (2认同)

dav*_*puh 5

好的,所以我创建了这个库,用于在ruby中创建控制台应用程序.实际上它是在不久前,但只是决定释放它.如果与HighLine和Readline一起使用,它确实支持自动完成.

当我写它时,没有任何文档或测试/规格,但现在我做了一些.仍然不多,但开始应该没问题.

所以gem cli-console和代码在GitHub,这是用例


Dav*_*tia 5

TTY是一个很容易做这类事情的好宝石.你有很多工具可以单独使用或使用完整的toolKit.您可以使用颜色,提示,执行shell本机,与屏幕交互,打印表格,进度条以及命令行的许多其他有用元素,这些都是goop api的简单方法.

特别是tty-prompt对于询问用户输入非常有用.

您提出的案例的简要示例:

require 'tty-prompt'
require 'pastel'

prompt = TTY::Prompt.new
loop do
  cmd, parms* = prompt.ask('user@machine$ ').split /\s/
  case cmd
    when "hola"
      puts "Hola amigo " parms
    when "exit"
      break if prompt.yes?('Do you really want to exit?')
  end
end
Run Code Online (Sandbox Code Playgroud)