Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

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での書き方で、めちゃくちゃ見やすくなった!!!!!

おわり

ご清聴ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.