コマンドラインからポモドーロをすることが出来るgomodoroの0.2.0をリリースしました🎉🎉
リリース内容
- ちゃんとしたCLIにするための基盤作成
- 残り時間をかえすコマンドの提供
一つずつ紹介していければと思います。
ちゃんとしたCLIにするための基盤作成
ちゃんとしたCLIってなんだ?だと思うのですが、僕の中の定義としては複数の機能がサブコマンドとして提供されていて(例えばパッケージを管理するCLIでInstall
, update
, list
のようなサブコマンドが提供しているイメージ)、それぞれにオプションを渡せるしCLI共通で使うグローバルなオプションも指定できたりする。
つまりコマンドラインからの操作性が良い感じのやつですかねw
今までのgomodoroではコマンドラインから起動する際にオプションを渡すことが出来て内部的にはgoのflag
パッケージを使っていました。
単一の機能を提供し、それに対するオプションをわたすだけであればこれで十分なんですが、複数のコマンドを提供してそれぞれのオプションが指定できて、コマンドをまたぐグローバルなオプションがあってとなると管理が大変になるなと。。。
他のGoのCLIではどうしてるんだろうということで見てみるとどうやらurfave/cliが良さそうということでこれを今回は採用しました。
urfave/cliについては以前書いた記事があるのでそちらを参考にしてください。
これにより良い感じのCLIを作るための環境が出来上がりました。
$ gomodoro -h NAME: Gomodoro - Pomodoro Technique By Go USAGE: gomodoro [global options] command [command options] [arguments...] VERSION: 0.2.0 COMMANDS: start pomodoro start remain Get Remain help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --conf-path value, -c value gomodoro config path (default: "/hoge/.gomodoro/config.toml") --app-dir value, -a value application directory (default: "/hoge/.gomodoro") --socket-path value, -s value gomodoro socket path (default: "/tmp/gomodoro.sock") --help, -h show help --version, -v print the version
残り時間をかえすコマンドの提供
ちゃんとしたCLIの基盤が整ったので、メインのpomodoroをスタートするgomodoro start
とは別に残り時間を取得するgomodoro remain
コマンドを作成しました。
とりあえず複数のコマンドを提供したいから作ったという理由もあるのですが、別の用途として今回は作成しました。
それは次のエントリで書こうと思います。。。
仕組みですが、残り時間をかえすコマンドの提供で考えないといけないのが残り時間をどう共有するかです。
gomodoro start
コマンドで残り時間の管理をしているのですが、gomodoro remain
コマンドで別プロセスをたてるので何かしらこのプロセス間で残り時間を共有する必要があります。
これを実現するために今回はUNIX Domain Socketを利用しました。
GoではSocket通信も標準のnet
パッケージで提供されているので、これを使って作成することが出来ます。
UNIX Domain Socket以外にもTCPとかもあります。
net - The Go Programming Language
残り時間を管理している側で次のようなプログラムを起動します。
listener, err := net.Listen("unix", socketPath) if err != nil { panic(err) } for { // 通信があるまでまっている conn, err := listener.Accept() if err != nil { panic(err) } go func() { defer conn.Close() min, sec := timerClient.GetRemainMinSec() sendMsg := fmt.Sprintf("%02d:%02d", min, sec) // レスポンスとして残り時間をかえす conn.Write([]byte(sendMsg)) }() }
次に残り時間を取得する側です。
// ソケットを介して通信を開始する conn, err := net.Dial("unix", socketPath) if err != nil { return err } defer conn.Close() reply := make([]byte, 1024) // レスポンスとしてうけとった時間をreplyにあてる _, err = conn.Read(reply) if err != nil { return err } fmt.Printf("%s", reply) return nil
これで好きなタイミングでコマンドラインからgomodoro remain
とうつと残り時間を取得することが出来るようになりました。
最後に
今回はgomodoroのv0.2.0で提供した機能について書きました。
今後もちょこちょこアップデートしていこうと思うので、そしたらまた書きます。