使用Thor创建嵌套子命令

myss37ts  于 2022-10-15  发布在  Ruby
关注(0)|答案(2)|浏览(128)

我想创建一个CLI工具,它的命令格式如下:
clitool jobs execute some-job --arg1 value --arg2 another_value
有没有可能在雷神内部拥有子命令的子命令?我还想保留我在clitool jobs execute子命令的类中为execute下的任何其他子命令定义的CLASS_OPTIONS。

xoefb8l8

xoefb8l81#

我已经成功地使用子命令的子命令,尽管有一个小错误。我还没有尝试为子命令保留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

$

最后一个帮助文本应该显示“clitoolJobsEXECUTE SOME_JOB...”,但是前缀jobs被省略了。也许有一位大师可以告诉我如何纠正这一点。

vc6uscn9

vc6uscn92#

我知道这有点离题,但这个问题出现在上面的答案和一些评论中。如果任何人需要显示Thor嵌套子命令帮助,并遇到了前面提到的“错误”,可以使用我创建的这个gem来处理它。我在我的几个宝石中使用了它:thor_nested_subcommand

相关问题