Go言語でCLIを楽しく!Bubble Tea入門
やぁ、ソフトウェアエンジニアの皆さん!今日は、Go言語を使ったCLI開発を劇的に楽しくしてくれるフレームワーク「Bubble Tea」について、飲み比べコント風にご紹介しますね。
このお酒、見た目は素朴な「ターミナル画面」なんだけど、一口飲むと「わ、これすごい!」ってなるんですよ。
Bubble Tea は、Go言語でTUI(Terminal User Interface)を構築するためのフレームワークです。TUIっていうのは、ターミナル上でマウスを使ったり、キーボードでフォームに入力したり、リストを選択したりできる、ちょっとしたGUIみたいなものだと思ってください。
「CLIで十分じゃん?」って思うかもしれませんが、Bubble Tea を使うと、ユーザー体験がグッと向上します。例えば、ログをリアルタイムで表示したり、設定項目をインタラクティブに選択させたり、進捗バーを表示したりと、ただのコマンドラインツールを超えたリッチなアプリケーションが作れるんです。
| 飲み比べポイント | 特徴 |
| 香り | Elmアーキテクチャという、状態管理に優れた設計思想がベース。シンプルで分かりやすい。 |
| 味わい | Model、Update、Viewという3つの要素で構成されている。このシンプルさが、大規模なアプリケーションでもコードをきれいに保つ秘訣。 |
| 後味 | Go言語の強力な並行処理と相性が良く、非同期処理も楽々。 |
このお酒が真価を発揮するのは、こんな時です。
複雑な設定が必要なCLIツール
設定ファイルを直接編集させる代わりに、対話形式で設定をウィザード形式で進められるツール。
長時間かかる処理の進捗表示
ただ...と表示するだけでなく、プログレスバーや処理中の詳細なログをリアルタイムで表示する。
サーバー監視ツール
ターミナル上でCPU使用率やメモリ使用率をリアルタイムグラフで表示したり、サービスを再起動するボタンを表示したり。
例えば、「Docker のコンテナを停止しますか?」「停止するコンテナを選んでください」といった対話的な操作を、ターミナル上でかっこよく実現できます。
さあ、この美味しいお酒をどうやって手に入れるか、ですよね。
まずはGoプロジェクトにBubble Teaを導入します。
go get github.com/charmbracelet/bubbletea
これだけでOKです。
では、実際に一杯飲んでみましょう!ごくシンプルなカウンターアプリのサンプルコードです。
package main
import (
"fmt"
tea "github.com/charmbracelet/bubbletea"
"os"
)
// Model はアプリケーションの状態を保持します
type model struct {
count int
}
// Init はプログラム開始時の初期化を行います
func (m model) Init() tea.Cmd {
return nil
}
// Update はユーザーの入力やイベントに応じて Model を更新します
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.KeyMsg:
switch msg.String() {
case "ctrl+c", "q":
return m, tea.Quit // プログラムを終了
case "+":
m.count++ // カウンターを増やす
case "-":
m.count-- // カウンターを減らす
}
}
return m, nil
}
// View は現在の Model の状態を元に、表示する内容を返します
func (m model) View() string {
s := fmt.Sprintf("現在のカウント: %d\n\n", m.count)
s += "'+' で増やす, '-' で減らす, 'q' で終了\n"
return s
}
func main() {
p := tea.NewProgram(model{})
if _, err := p.Run(); err != nil {
fmt.Println("実行中にエラーが発生しました:", err)
os.Exit(1)
}
}
上記のコードを main.go として保存し、以下のコマンドで実行します。
go run main.go
ターミナルで + キーや - キーを押してみてください。カウンターの数字がリアルタイムで変化するのがわかるはずです。q キーでプログラムが終了します。
model
アプリケーションの「状態」を保持する構造体。この例では count だけですね。
Init()
プログラムが起動した時に一度だけ呼ばれる。特に初期化処理がなければ nil を返せばOK。
Update()
ユーザーがキーを押したり、何らかのイベントが発生したときに呼ばれます。msg(メッセージ)を見て、model を更新し、更新後の model と次のアクションを返します。
View()
現在の model の状態を元に、ターミナルに表示する文字列を返します。
この3つのシンプルなコンポーネントが、Bubble Tea の魅力的な味わいを生み出しているんです。