Golangでコマンドラインツールを作ってみた
久しぶりの更新、何もしてなかったわけじゃないよ。
作ったもの
環境・使用したツール
Golangの経験はpaizaの問題を数問解いた程度なのでコードの汚さは許してほしい。
cli.goを使えば楽に作れたのだろうが試しに全て自分で書いた。(色々なサイトは見回ったけど)
アーキテクチャ
コマンドライン引数をパラメータとオプションに分ける(言い方が間違っているかもしれないけど・・・)
if 1 < len(os.Args) { for _, i := range os.Args[1:] { if '-' == i[0] { option = append(option, i) } else { parameter = append(parameter, i) } } } if 0 == len(parameter) { parameter = append(parameter, "help") }
次にパラメータからどのコマンドを実行しているか調べる
switch parameter[0] { case "version": Cversion(version) case "help": Chelp(parameter) case "hello": Chello(parameter[1:]) case "build": Cbuild(parameter[1:]) default: error("run", "unknown command "+parameter[0], "Run 'run help'")
そして関数に必要な情報を渡して実行する
今はまともな機能がないのでオプションとかは存在しないけど
問題点
構造上の問題
- 現時点ではコマンド呼び出しをswitchで実装しているためコマンド量が増えると読みづらくなる
- ツールのオプションとコマンドのオプションが一緒くたになっているので拡張しようにもできない → 読み込みつつ処理するか順番を意識しないとダメ
- ヘルプのところの文章をコードに書き込むので管理が面倒→直接書き込むのではなくgo-bindataを使ってテキストファイル化してもいいかも
個人的な問題
- main内とかはちゃんと考えて書いていたけどビルドするところでは適当に書いてしまった気がしてる(なかった場合の処理を書いていないし・・)
感想
他のコマンドラインツールの書き方を見習うべきだと思った。
とりあえず暇つぶし程度に続きを書きたい。