CLI friendly packages
Mediado.go #2 lunarxlark
アジェンダ
- CLIパッケージの使い分け
- urfave/cliを使っていて
- 良い(?)コマンドとは
- urfave/cliでの好きな書き方
自己&キーボード紹介
小林優太 := &発表者{
Github : "lunarxlark",
Twitter : "@lunarxlark",
趣味 : ["自作キーボード", "犬の散歩"],
在籍 : "約1年半",
映画 : ["Matchstick Men", "Fight Club", "攻殻機動隊 SSS 3D"]
}
自己&キーボード紹介
所持キーボード := []*キーボード{
MINILLA,
HHKB_BT,
&自作キーボード{
キット名 : "Corne Cherry(crkbd)",
キースイッチ : "KBDfans T1 タクタイルスイッチ",
キーキャップ : "GMK Dots",
},
&自作キーボード{
キット名 : "Ergo Dash",
キースイッチ : "Tiffany Blue Tealios V2",
キーキャップ : "GMK Solarized",
},
&自作キーボード{
キット名 : "Lily58 pro",
キースイッチ : "Gateron Silent Red",
キーキャップ : "MDA BigBang",
},
...
}
好きなコマンドたち
- junegunn/fzf
- x-motemen/ghq
- hashicorp/terraform
- rclone/rclone
- direnv/direnv
- mattn/memo
CLIパッケージの使い分け
(※私が観測した狭い範囲です。)
CLIパッケージの使い分け
spf13/cobra
- cli/cli
- docker/cli
- rclone/rclone
- gohugoio/hugo
urfave/cli
- x-motemen/ghq
- mattn/memo
flag
- tsenart/vegeta
etc
- hashicorp/terraform
- direnv/direnv
CLIパッケージの使い分け
spf13/cobra
- cli/cli
- docker/cli
- rclone/rclone
- gohugoio/hugo
-> コマンド自体が製品
CLIパッケージの使い分け
urfave/cli
- x-motemen/ghq
- mattn/memo
-> 個人での使用が主
CLIパッケージの使い分け
- hashicorp/terraform (mitchellh/cli)
- direnv/direnv
-> オリジナル
どのCLIパッケージ使っていますか?
- ユーザは誰?
- 用途は?
- 理由は?
- 使い心地は?
- オススメは?
どのCLIパッケージ使っていますか?
私は(業務|プライベート)で主にurfave/cli
どのCLIパッケージ使っていますか?
私は(業務|プライベート)で主にurfave/cli
- ユーザ : チームメンバー(7人のみ)
- 用途 : バッチ、ちょっとしたツール
- 理由 : 最初に触れたCLIパッケージだったから。 あまり複雑なコマンド体系を必要としないから。
urfave/cliを使っていて
- コマンドの設定が見辛くなってくる
- 必須オプションが欲しくなる
- zshでの補完機能が欲しい
urfave/cliを使っていて
- [?] コマンドの設定が見辛くなってくる
v2対応
- [○] 必須オプションが欲しくなる
- [○] zshでの補完機能が欲しい
urfave/cliを使っていて
- [?] コマンドの設定が見辛くなってくる
v2対応
- [○] 必須オプションが欲しくなる
- [○] zshでの補完機能が欲しい
- helpにデフォルト値が表示される
- timestampフラグの追加
urfave/cliを使っていて
- [?] コマンドの設定が見辛くなってくる
v2対応
- [○] 必須オプションが欲しくなる
- [○] zshでの補完機能が欲しい
- helpにデフォルト値が表示される
- timestampフラグの追加
影響が大きそうな仕様変更
- コマンドとオプションの間に引数を置けなくなった
- Flagエイリアスがstructに追加された
- Actionがerrorを返すようになった
コマンドについて
- 良いコマンドとは?
- 敬遠したくなるコマンドとは?
コマンドについて
- 良いコマンドとは?
- 移植性がある
- 多くのことをしない
- シンプル
- 名前から動作を理解しやすい
コマンドについて
- 良いコマンドとは?
- 移植性がある
- 多くのことをしない
- シンプル
- 名前から動作を理解しやすい
関数名に悩むように、オプション名や機能分けには悩む
コマンドについて
- 敬遠したくなるコマンドとは?
- 対話式でスクリプト等に埋め込めない
- helpがわかりにくい
- オプションが多い
- さらにオプションで機能分割している
-> じゃあ、どういうコマンド体系にしたらいいの?
わかりやすいコマンド体系
英文のように
$ 自作コマンド名 限定的な(機能|役割) 動詞 --(形容詞|副詞etc) 対象
わかりやすいコマンド体系
英文のように
$ 自作コマンド名 限定的な(機能|役割) 動詞 --(形容詞|副詞etc) 対象
サブコマンドには、動詞 or 限定的な(機能|役割)名を!
urfave/cliでの好きな書き方
// mysqs.go
func main() {
if err := newApp().Run(os.Args); err != nil {
fmt.Println(err.Error())
}
}
func newApp() *cli.App {
app := cli.NewApp()
app.Commands = cmd.commands
return app
}
// cmd.go
var commands = []*cli.Command{
cmdQueue,
cmdPurge,
cmdList,
}
var cmdQueue= &cli.Command{
//Name: "queue, q",
Name: "queue",
Aliases: []string{"q", "qu"},
Action: doQueue,
Flags: []cli.Flag{
&cli.StringFlag{Name: "file"},
&cli.StringFlag{Name: "queue-name"},
&cli.StringFlag{Name: "env"},
},
}
func doQueue(ctx *cli.Context) error {
...
}
urfave/cliを使っていて
- [◎] コマンドの設定が見辛くなってくる
-> x-motemen/ghqでの書き方で、めちゃくちゃ見やすくなった!!!!!
おわり
ご清聴ありがとうございました。