sMashでは、標準で実装されている各種zeroコマンドの他に、カスタムzeroコマンドをGroovyやPHP、Javaで実装することが可能です。
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.cli.tasks/ExtendingCli.html
カスタムzeroコマンドを利用するには、大きく分けて2つの手順が必要です。
1. カスタムzeroコマンドを実装するsMashアプリの作成・公開
2. sMash本体への依存性追加・解決
●1. カスタムzeroコマンドを実装するsMashアプリの作成・公開
まず、アプリケーションを作成します。ここでは、MyCommandsという名前とします。この名前はコマンド名とは無関係です(リポジトリー内のパッケージ名となります)。最終的にsMashのリポジトリーに取り込まれるため、作成する場所はどこでも構いません。
zero create MyCommands
次に、MyCommandsアプリケーションの/config/zero.configを編集します。ここには、コマンド名と、そのコマンドを処理するイベント・ハンドラーを記述します。例えば、”zero mytask”コマンドを作成する場合は、以下のように記述します。
# MyTask
/config/handlers += [{
"events": "cliTask",
"handler" : "cliTask.groovy",
"conditions" : "/event/task =~ mytask"
}]
/config/handlersは、イベント・ハンドラーを登録するためのグローバル・コンテキストのキーです。ここには、3つの値をJSON形式で記述します。
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.core/Config.html#Event_handler_registration
events : イベント名。コマンドの場合は”cliTask”という名前を指定しなければなりません。
handler : イベント・ハンドラーの名前。パスを指定しない場合は、/app/scripts内のファイルとして扱われます。
conditions : 実行中の間、有効な値。/event/taskに指定した値がコマンド名になります。また、/event/subTaskに指定した値が、コマンドのサブタスク名になります。
ちなみに、他のポート番号などは、コマンド実行時には全く影響しません。
次に、zero.configで指定したイベント・ハンドラーを実装します。/app/scriptsディレクトリーに、cliTask.groovyを作成し、以下のように記述します。
def onCliTask() {
def task = zget(”/event/task”)
System.out.println(”task name is ” + task)
zget(”/event/args”).each{System.out.println(”arg is ” + it)}
}
このコードでは、onCliTask()メソッドを定義し、タスク名を”task name is XXXX”と出力します。また、その後に引数があった場合には、その数だけ”arg is YYYY”と出力します。
これで、カスタムコマンドの実装は完了です。このアプリケーションをリポジトリに公開します。MyCommandsディレクトリに戻り、zero packageコマンドと、zero publishコマンドを実行してください。
以上で、アプリケーション側の操作は完了です。最後に、sMashにこのアプリケーションの依存性を追加します。
●2. sMash本体への依存性追加・解決
sMash本体のディレクトリーを開き、config/ivy.xmlファイルを開き、以下の1行を<dependencys>内に追加します。
<dependency name=”MyCommands” org=”zero” rev=”[1.0.0.0,)”/>
これにより、通常のCLIに加え、先ほど作成したコマンドがsMashで使えるようになります。ivy.xmlを保存して終了した後、zero resolveを実行してください。zero resolveが失敗する場合は、アプリケーションの公開に失敗していますので、リポジトリーを確認してください。
今回作成したコマンドの実行例は以下の通りです。
このカスタムコマンドの実行のためにsMashのアプリケーションを起動しておく必要は全くありません。通常のzeroコマンドと同様に利用できます。
