Open IkumaTadokoro opened 2 years ago
CLIツールの実装に役立ちそうなので、velociraptorのソースを読んでいく。
https://github.com/jurassiscripts/velociraptor/tree/main/src
ヴェロキラプトルはジュラシック・パークによく出てくるやつ
ドキュメントによるとエントリポイントはcli.ts
なので、そこをみていく。
$ deno install -qAn vr https://deno.land/x/velociraptor@1.4.0/cli.ts
https://velociraptor.run/docs/installation/#installing-from-%F0%9F%A6%95-deno.land
https://github.com/jurassiscripts/velociraptor/blob/main/cli.ts
import { loadConfig } from "./src/load_config.ts";
import { VrCommand } from "./src/cli/commands/vr.ts";
if (import.meta.main) {
const config = await loadConfig();
new VrCommand(config).parse(Deno.args);
}
import.meta.main
は「このファイルが直接呼ばれた場合」のDeno版。
loadConfig
で設定を読み込んで、VrCommand
を生成している。
ざっとドキュメントをみた感じだと、特にvr config
的なコマンドはないので、loadConfig
では何をやっているんだろう。
次はこちらを覗くことにする。
https://github.com/jurassiscripts/velociraptor/blob/main/src/load_config.ts
loadConfig
は呼び出しディレクトリから再帰的に親を辿っていき、velociraptorの設定ファイルを読み取るような構造になっている。最終的に命名規約に則る設定ファイルがあれば、そのディレクトリと設定ファイルの内容を読み取る
https://github.com/jurassiscripts/velociraptor/blob/main/src/load_config.ts#L15
内部で使用されている主なstd libとして次がある
path:pathの操作
https://deno.land/std@0.142.0/path
fs/exists:ファイルの存在チェック
https://deno.land/std@0.142.0/fs/exists.ts
encoding/_yaml/parse:yamlのparse
https://deno.land/std@0.142.0/encoding/_yaml/parse.ts
次は実際のコマンドの方をみていく
CLIで書いていたら、GitHubのAPI Limitが来て無事死亡。 書き終わった後に制限がくるの辛すぎないか。
https://github.com/jurassiscripts/velociraptor/blob/main/src/cli/commands/vr.ts#L15
CliffyのCommand
クラスを継承して、constructorの中で処理を呼び出している。
各サブコマンドもこの中で登録されている。
.command("run", new RunCommand(this.configData))
.command("run-hook", new RunHookCommand(this.configData))
.command("export", new ExportCommand(this.configData))
.command("upgrade", new UpgradeCommand())
.command("completions", new CompletionsCommand().hidden())
他のサブコマンドの実装も同じ形式になっているので、大体こんな感じで作っていけば作りやすそう
Denoの公式マニュアル簡単に検索できたらいいのにな〜。Dashだとできるんかな