cli昔にも似たような記事を書いていたみたいだった。最近のgoでのCLIツールを書く際の心境の変化があったのでその辺をメモしておく。心境の変化は2つコマンドラインオプションをstructで囲む理由が特になくなったサブコマンドがやっぱりほしいコマンドラインオプションをstructで囲む理由が特になくなった昔はわざわざコマンドラインオプションをstructで囲んで、Run()関数に渡していたのだけれど。そもそもRun()関数が長々と書かれていたらそれはmain.goの記述が長すぎる。一度しか使われないものはグローバル変数で良いということでグローバルの変数としてポインタを保持する形式になった。Run()に対して引数として渡す必要もなくて、dereferenceしてあげればおしまい。それ以前の段階で引数のvalidationは通っているはずなので。Run()がエラー値を返すのはそのまま。サブコマンドがやっぱりほしいサブコマンドのものとコマンドが1つだけのものをほとんど同様の記述で書きたい。いうわけで少し不思議なコードになっている。以下の様な感じで書く。kingpinを使うのは惰性なので他のライブラリが便利ならそれを使っても良い。pathにhackが入っているけれどその辺りは読み替えてほしい)サブコマンドを定義するときにはだいたい以下の様な構造にしている。何も考えずにパッケージを分けちゃったほうがあとあと楽という結論になった。v2.2.6)ポイントはサブコマンドとしての定義とそうではない場合の1つのコマンドとしての定義の記述が概ね同じような形になるようにしている点。あと気持ちの問題でヘルプメッセージに色を付けている。monogusa今までただの関数をCLIとして利用できたり、ちょっとしたwebAPIとして利用できるようにしていたけれど。今度はmonogusaを使ってただのpythonの関数をslackやdiscord上のコマンドとして公開できるようになった。以下の様な関数がある。print("byebye")これを以下の様な形で呼ぶとbotになる。02hello.pyslack上での表示slackbotの場合にはthreadとして実行結果を返す。インターフェイス自体はほぼほぼCLI上のコマンドのまま。丁寧な進捗表示やコンソールの同期のようなリッチな機能は存在していない。始まる投稿に反応する。オプションで変えられる。ヘルプメッセージを表示してみる。helloとbyebyeが公開されている。試しにhelloを実行してみる。