Project

General

Profile

提案 #1484

CLIコマンドのプラグインサポート

Added by Shibafu Midorino 5 months ago. Updated 4 months ago.

Status:
実装待ち
Priority:
通常
Assignee:
-
Target version:
-
プラグイン名:
ブランチ:

Description

プラグインからCLIコマンドを提供し、実行できるようにする手段が欲しいです。
これがあると、GUIなしでWorldを生成するインタラクティブ処理が提供できたりします。(昔の account サブコマンドみたいな)

以前に #1238 などを見て、需要はあるけどユーザからは簡単に手が出せないから諦めになってるのかなと思っています。

雑に考えた感じだと、プラグインのロードを伴わずにCLIコマンドを列挙するための仕組みとか、実際にプラグインに処理を渡す時にはコアルーチンと最低限の依存関係のロードが済んだ状態の作りこみなんかは必要かなと。
今ある core/boot/shell だとその辺はかなり割り切っているので、ちゃんと仕組みにしないといけないですね…

#1

Updated by Shibafu Midorino 5 months ago

とりあえず思いつきで作ったドラフト版をブランチ topic/1484-cli-draft として共有しておきます。名前は適当。
最低限のコアルーチンを読みながら列挙処理を走らせて実行するくらいしかしてないので、プラグインの依存関係解決とかは明示的な命令が必要。

.mikutter.yml に prelude というキーを追加し、ここにプラグインロードに先駆けて読み込むファイルを列挙します。
~/.mikutter/plugin/test/.mikutter.yml と、同じディレクトリにCLI定義用スクリプト prelude.rb があるとして、こんな風に。

---
slug: :test
depends:
  mikutter: 4.1.4
  plugin: []
version: '1.0'
author:
name: test
description: ''
prelude:
  - prelude.rb

そして、prelude.rb はこんな風に。

# frozen_string_literal: true

Prelude.namespace :test do
  command :sample do
    puts 'プラグインレベルで定義されたCLIコマンドです'
  end

  command :worlds, description: 'Worldを列挙' do
    # プラグインの実装に依存したコードを使うためには明示的にロードする
    load_plugin :activity, :world

    Plugin.collect(:worlds).each do |w|
      pp w
    end
  end
end

これで ruby mikutter.rb test:sampleruby mikutter.rb test:worlds でそれぞれ呼び出せるといった感じですね。

#2

Updated by toshi_a 初音 4 months ago

  • Status changed from 分類待ち to 実装待ち

これ良いですね。標準のコマンド類もこの仕組みでプラグイン化したいくらい(特に依存関係グラフの出力とか)

DSLも良い感じですが、現在のサブコマンドは、指定されたコマンドのみがロードされて実行される仕組みなので、通常起動時にはコマンドに関するコードが一切読み込まれないようになっているので、同じようにしたいです。

名前空間自体には賛成ですが、任意に決定できるようにはせず、プラグインスラッグを名前として用いることを強制して、どのプラグインが提供しているものかを名前から確実に判断できるようにしたいです。

--helpなどでコマンド一覧を取得する時には全ファイルをロードして、 Prelude.commands を呼ぶのが楽そう。specファイルにそのへんも記述させてもいいかもしれないけれど、コマンド一覧を出したあとはどうせすぐにmikutter終了するので、読み込んじゃっていいかな

Also available in: Atom PDF