首页 > 解决方案 > 使用 Thor 创建嵌套子命令

问题描述

我想创建一个 CLI 工具,它的命令格式如下:

clitool jobs execute some-job --arg1 value --arg2 another_value

是否可以在 Thor 中拥有子命令的子命令?我还想保留我在类中为clitool jobs execute子命令定义的 class_options 以用于execute.

标签: rubyrubygemscommand-line-interfacethor

解决方案


我已经成功使用了子命令的子命令,虽然有一个小错误。我没有尝试为子命令保留 class_options,所以我没有答案。

对于嵌套的子命令,以下工作:

class Execute < Thor
  desc 'some_job', 'Execute something'
  option :arg1, type: :string, desc: 'First option'
  option :arg2, type: :string, desc: 'Second option'
  def some_job
    puts "Executing some_job:"
    puts "  --arg1 = #{options[:arg1]}"
    puts "  --arg2 = #{options[:arg2]}"
  end
end # class Execute

class Jobs < Thor
  # Other task definitions
  desc 'execute', 'Execute jobs'
  subcommand 'execute', Execute
end # class Jobs

class CliTool < Thor
  # Other task definitions
  desc 'jobs', 'Do stuff with jobs'
  subcommand 'jobs', Jobs
end

CliTool.start

这似乎做你想做的事:

$ clitool jobs execute some-job --arg1 value --arg2 another_value
Executing some_job:
  --arg1 = value
  --arg2 = another_value

$

似乎有一个错误:子命令的子命令的帮助文本无法正常工作:

$ clitool help
Commands:
  clitool help [COMMAND] # Describe subcommands or one specific subcommand
  clitool jobs           # Do stuff with jobs

$ clitool jobs help
Commands:
  clitool jobs execute        # Execute jobs
  clitool jobs help [COMMAND] # Describe subcommands or one specific subcommand

$ clitool jobs help execute
Commands:
  clitool execute help [COMMAND] # Describe subcommands or one specific subcommand
  clitool execute some_job       # Execute something

$

最后的帮助文本应显示“clitool jobs execute some_job...”,但前缀jobs被省略。也许那里有一位大师可以告诉我如何纠正它。


推荐阅读