Closed8
deno-cliffy使おう
いろいろ試したいのでrepo作った
cliffyのrepoはこちら
まだv0.19.2でunder developmentだけどかなり充実していそうなので使っていこういくつか機能があるからドキュメントに従って一つ一つ試していこう
まずはansi
deps.ts
import {
ansi,
colors,
cursorTo,
tty,
} from "https://deno.land/x/cliffy@0.19.2/ansi/mod.ts";
以下は最初の例
上に移動して左に移動して削除してる?表示が消える
main.ts
import { ansi } from "./deps.ts";
console.log(ansi.cursorUp.cursorLeft.eraseDown());
以下は画像を表示する例
かと思ったけど何も表示されないぞ…ふたつの"\n"
だけが動作している
main.ts
const { cursorTo, eraseDown, image, link } = ansi;
const response = await fetch("https://deno.land/images/hashrock_simple.png");
const imageBuffer: ArrayBuffer = await response.arrayBuffer();
console.log(
cursorTo(0, 0) +
eraseDown() +
image(imageBuffer, {
width: 29,
preserveAspectRatio: true,
}) +
"\n" +
link("Deno Land", "https://deno.land") +
"\n",
);
ドキュメントと同じくdirect importしたりansi.cursorTo()
みたいに使ったら表示されたな…なんじゃこりゃ…
main.ts
import {
cursorTo,
eraseDown,
image,
link,
} from "https://deno.land/x/cliffy/ansi/ansi_escapes.ts";
いまさらだけどドキュメントにAPIの一覧とかないんだね 使用例しか載ってない
colorsのテスト
std/fmt
のラッパーとのこと
main.ts
import { colors } from "./deps.ts";
// Define theme colors.
const error = colors.bold.red;
const warn = colors.bold.yellow;
const info = colors.bold.blue;
// Use theme colors.
console.log(error("[ERROR]"), "Some error!");
console.log(warn("[WARN]"), "Some warning!");
console.log(info("[INFO]"), "Some information!");
// Override theme colors.
console.log(error.underline("[ERROR]"), "Some error!");
console.log(warn.underline("[WARN]"), "Some warning!");
console.log(info.underline("[INFO]"), "Some information!");
なるほどこれはchalkっぽい?
続いてcommand
deps.ts
import { Command } from "https://deno.land/x/cliffy@v0.19.2/command/mod.ts";
これいちいちコピペするよりサンプルスクリプトを直接run from webしてったほうが早いな
velociraptorの実装が参考になるかも https://github.com/jurassiscripts/velociraptor/blob/main/src/cli/commands/vr.ts
Command().option()
でオプションを設定可能
-
-h, --help
は絶対に設定される- 自分で設定した
-h
より優先されるっぽいので事実上-h
オプションは追加不可能
- 自分で設定した
-
.version()
を使うと-V, --version
オプションが追加される-
-v
じゃないんだ?
-
- 受け取ったオプションを使うためには
.parse(Deno.args)
を呼ぶ- オプションはオブジェクトに、引数は
args
配列に、リテラルはliteral
配列に入れられる - 設定されていないオプションがある場合はエラー1を返す
- オプションはオブジェクトに、引数は
- velociraptorの実装には
.parse()
が使われていないな- .action(callback)`を呼ぶとメソッドチェーン内でオプションを受け取って実行可能?
- オプションを複数指定する場合は繋げられる
-
-ab
は-a -b
と同じ -
-n5
は-n 5
とか-n=5
と同じ - これは標準ライブラリじゃ(多分)できないからありがたいな
-
各種オプションの設定
const { options } = await new Command()
// 第1引数がオプション名、第2引数がhelp画面で表示される説明
.option("-s, --silent", "disable output.")
// []がオプショナル引数の表示 これでいうと`-d`も`-d 10`もOK
.option("-d, --debug [level]", "output extra debugging.")
// <>が必須引数の表示 これでいうと`-p 80`はOKだが`-p`のみはNG
.option("-p, --port <port>", "the port number.")
// 第3引数のオプションの`default`でデフォルト値を指定できる
// 以下で何も指定しないと`allow`はundefinedだが`-a`だけ指定すると`localhost`になる
.option("-h, --host [hostname]", "the host name.", { default: "localhost" })
// 引数はコロンを付けることで型指定が可能 デフォルトは`string`
.option("-s, --small [small:boolean]", "Small pizza size.")
// 使えるのは`boolean` `string` `number` `integer`の4種
.option("-a, --amount <amount:integer>", "Pieces of pizza.")
// 配列も指定可能
.option("-l, --list <items:number[]>", "comma separated list of numbers.")
// セパレータを帰る場合は第3引数で設定
// この場合`-o "1 2 3"`のようにクォートして渡す必要あり
.option(
"-o, --other-list <items:string[]>",
"space separated list of strings.",
{ separator: " " },
)
// ドットをつけてネストすると`{ bitrate: {audio: 100 } }`のように使用できる 階層は無制限
.option(
"-b.a, --bitrate.audio, --audio-bitrate <bitrate:number>",
"Audio bitrate",
)
// `--no-xx`オプションは使用すると`{ xx: false }`を受け取れる
// また、自動でデフォルト値が`true`の`xx`オプションが設定される
.option("--no-check", "No check.")
// 通常のオプションと組み合わせることも可能
.option("-r --remote <url:string>", "Remote url.")
.option("--no-remote", "No remote.")
// ...をつけることで`-d a b c`のように複数の引数を指定可能
// ただしこれを使うパラメータは最後に渡されなければならない
.option("-d, --dir [otherDirs...:string]", "Variadic option.")
.parse(Deno.args);
その他、第3引数に指定できるkeyの例
-
required: true
- オプションの使用自体を強制する
-
global: true
- サブコマンドでも同様の引数を定義する
- これがない場合、サブコマンドの引数は全く別のものとなる
-
hidden: true
- ヘルプ画面に表示されなくなる 何の意味が…?
-
standalone: true
- 他のオプションと組み合わせられなくなる
-
--version
とか--help
とかと同様
-
conflicts: ["option-name"]
- 特定のオプションと組み合わせられなくする
-
depends: ["option-name"]
- 特定のオプションとの組み合わせを強制する
-
collect: true
-
--color red --color blue
のようにオプションが複数指定されることを許す - これがない場合、複数回指定されるとエラーを吐く
- 値は(1つしかなくても)配列としてまとめられる
-
-
value: callback
- オプション引数が渡される関数 要するになんでもできる
- 奥が深そう https://cliffy.io/command/index.html#custom-option-processing
-
action: callback
- オプションが指定されたときに実行される関数
続いてCommand
クラスの説明
…と思ったけど「説明書を全部読んでから作り始める」みたいなの良くないな、一旦終了
cliの勉強としてtを実装しよう
このスクラップは2ヶ月前にクローズされました