16

コマンド ラインでトール コマンドを呼び出す場合、メソッドはモジュール/クラス構造によって名前空間が付けられます。

class App < Thor
  desc 'hello', 'prints hello'
  def hello
    puts 'hello'
  end
end

コマンドで実行されます

thor app:hello

ただし、入れてその自己実行可能にする場合

App.start

下部で、次のようなコマンドを実行できます。

app hello

これらのコマンドに名前を付ける方法はありますか? たとえば、呼び出すことができるように

app say:hello
app say:goodbye
4

2 に答える 2

24

これを行う別の方法は、register を使用することです。

class CLI < Thor
  register(SubTask, 'sub', 'sub <command>', 'Description.')
end

class SubTask < Thor
  desc "bar", "..."
  def bar()
    # ...
  end
end

CLI.start

ここで、実行可能ファイルが foo と呼ばれると仮定すると、次のように呼び出すことができます。

$ foo sub bar

ただし、現在のトール バージョン (0.15.0.rc2) にはバグがあり、ヘルプ テキストでサブ コマンドの名前空間がスキップされます。

$ foo sub
Tasks:
   foo help [COMMAND]  # Describe subcommands or one specific subcommand
   foo bar             #

self.banner をオーバーライドして名前空間を明示的に設定することで、これを修正できます。

class SubTask < Thor
  namespace :sub

  def bar ...

  def self.banner(task, namespace = true, subcommand = false)
    "#{basename} #{task.formatted_usage(self, true, subcommand)}"
  end
end

バナーの元の実装との唯一の違いは、formatted_usage の 2 番目のパラメーターです。これを 1 回実行して、他のサブコマンド thor クラスに SubTask を継承させることもできます。これで次のようになります。

$ foo sub
Tasks:
   foo sub help [COMMAND]  # Describe subcommands or one specific subcommand
   foo sub bar             #

それが役立つことを願っています。

于 2011-08-31T12:28:07.843 に答える
5

これは、デフォルトの名前空間として App を使用する 1 つの方法です (かなりハックですが)。

#!/usr/bin/env ruby
require "rubygems"
require "thor"

class Say < Thor
  # ./app say:hello
  desc 'hello', 'prints hello'
  def hello
    puts 'hello'
  end
end

class App < Thor
  # ./app nothing
  desc 'nothing', 'does nothing'
  def nothing
    puts 'doing nothing'
  end
end

begin
  parts = ARGV[0].split(':')
  namespace = Kernel.const_get(parts[0].capitalize)
  parts.shift
  ARGV[0] = parts.join
  namespace.start
rescue
  App.start
end

または、理想的ではありません:

define_method 'say:hello'
于 2011-05-09T02:55:26.063 に答える