Techioz Blog

Thor を使用したネストされたサブコマンドの作成

概要

次のような形式のコマンドを含む CLI ツールを作成したいと考えています。

clitool ジョブは some-job –arg1 value –arg2 another_value を実行します

Thor 内にサブコマンドのサブコマンドを含めることはできますか?また、clitool ジョブの実行サブコマンドのクラスで定義した 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 run some_job…」と表示されるはずですが、プレフィックスのjobsは省略されます。もしかしたら、それを修正する方法を教えてくれる専門家がいるかもしれません。