使用 Thor 创建嵌套子命令

Creating nested subcommands using Thor

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

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

Thor 中是否可以有子命令的子命令?我还想为 execute.

下的任何其他子命令保留我在 class 中为 clitool jobs execute 子命令定义的 class_options

我已经成功地使用了子命令的子命令,尽管有一个小错误。我没有尝试为子命令保留 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。也许那里有一位大师可以告诉我如何纠正它。