1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

会社のプロジェクト毎に用意しているCLIツールについて語る

Posted at
1 / 10

CLI ツールを導入した理由

目標は エンジニアがどのプロジェクトに入っても,同じ操作体験で開発できる こと

導入する前の問題は

  • プロジェクト毎に作業の詳細が異なる
  • 長い README を元に作業するものの再現性がない
  • メンバ毎の秘伝のメモ帳が発展するが共有はされない

導入の経緯

  • CLI ツールを作っているチームがいると聞く 👍
  • Rust で作ろうと息巻く 😤
  • ShellSpript で書く方針に変更 🤔
  • ルーチンをひたすらコマンド化 🔥
  • 昔作られた CLI ツールをプロジェクト内で発見 🤭
  • 邪魔だったのでプロジェクトから削除 😗
  • 他プロジェクトに展開 🔥
  • CLI ツールを簡単に導入できるテンプレート作成 🎊
  • 高機能化に対応するため Python で部分的な機能を書き始めた 🔥(← 今ここ)

何ができるか

プロジェクト用のコマンドを書くとまずいので,テンプレートから参照

$ uvcli
UniqueVision でプロジェクト開発を便利にするためのCLIツールの雛形

Commands:
  General:
    welcome                     初めて開発する人向けの情報
    init[ialize] [OPTIONS]      初期化する
    cd [DIRECTORY]              プロジェクト内のディレクトリに移動する
    edit [FILE]...              エディタでプロジェクトを開く

  Containers:
    build                       ビルドする
    start                       開始する
    stop                        終了する
    process|ps [-s]             起動しているDockerサービス一覧を表示する
    exec[ute] SERVICE COMMAND   SERVICE_NAMEのコンテナで、COMMANDを実行する
    shell SERVICE               対象のコンテナにシェルではいる。
    restart SERVICE             特定のサービスを再起動する
    log [-f] [SERVICE]          ログを出力する
    url SERVICE                 指定したサービスへアクセスするURLを出力する


ディレクトリ構成

プロジェクト用のコマンドを書くとまずいので,テンプレートから参照

.
├── bin
│  └── uvcli
│
├── cli
│  ├── commands
│  │  ├── welcome.sh
│  │  └── ...
│  │
│  ├── completion
│  │  └── uvcli_cmdcomp.toml
│  │
│  ├── README.md
│  └── uvcli.sh
│
├── docker-compose.yml
└── README.md

実際の操作体験

インストール

git clone $YOUR_PROJECT
uvcli init
echo 'eval $(uvcli init -)' >> ~/.bash_profile

開発

# 開発開始
uvcli build
uvcli start

# 開発終了
uvcli stop

デプロイ

uvcli $REALM deploy

いや〜簡単ですね


補完機能

CLI を使うなら,補完機能は必須だと思っている

いいツールが見つからなかったので簡単に補完機能を用意できるツール cmdcomp を新規に設計

toml ファイルを書くことで補完機能の書き方を知らない人でも容易に補完機能を追加することができる!

[cmdcomp]
version = "0.1.0"

[app]
name = "uvcli"

[root.subcommands.welcome]

[root.subcommands.initialize]
alias = "init"
options = ["-"]

なぜ ShellScript で作ったのか?

実行速度,安全性,機能性,全てにわたって Rust が凌駕するでしょう...(当然)

しかし,Rust をどれだけの人が読み書きできるだろうか? 5 年後にも同じことが言えるだろうか?

ShellScript を採用した理由は みんなが書けて, 5 年後もそう だからだ(だよね 😉 )


高機能化について

高度な機能(あいまい検索,設定ファイルを元にした複雑な処理)が欲しい!

Python で複雑な機能を処理し ShellScript 内で呼ぶことにした

なぜ Rust で書かなかったのか?...clap v3 が正式リリースされてないからかな?


最後に

  • みんなも CLI ツールを作ろう 🤩
  • Shell Script は寿命が長いよ 😉
  • Shell Script には限度があるよ 😉
  • tcsh,fish には塩対応 🤫
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?