xshoji's blog

#Cli

1 post tagged with Cli

Go 標準の flag パッケージのテクニック集その1: Usageを綺麗に整形して見やすくする

業務でちょっとした検証用のツールや、調査用のコマンドラインアプリケーションを Go 言語で作成することがよくあります。 基本自分しか使わないのですが、何かきっかけでスクリプトを他の人に配ることもあり、このとき main.go のみで完結するようにしておくと、人に配るときや何らかの証跡と一緒に残しておくさいもテキストファイル一つ渡せば済むので大変便利です。 また、配布先の人がビルドする時もトラブルが圧倒的に少ないです。 このため、外部のライブラリが必ず必要という状況でない限りは、できるだけ Go 標準ライブラリだけでコマンドラインアプリケーションを作成するようにしています。

ただ、Go 標準の flag パッケージはコマンドライン引数のパースを簡単に実装できる反面、 Usage の出力があまり綺麗ではなかったり、ロングパラメータを扱うのが難しいなど色々使い勝手が悪い部分があります。 これまで、 spf13/cobraurfave/cli のような外部ライブラリを使わずに、どうにしか標準の flag パッケージだけで Usage を綺麗にしたりロングパラメータを扱えるようにしたりできないか試行錯誤したので、その実装方法について何回かに分けて紹介したいと思います。

今回は「 Usage を綺麗に整形して見やすくする 」方法について紹介します。 ここで紹介する方法(以降、呼びやすさのために「 Custom Usage 」と表現します)を使うと、標準の flag パッケージだけで以下のような綺麗な Usage を出力できるようになります。

$ go run main.go -h
Usage: main [OPTIONS]

Description:
  A sample command demonstrating simple template usage in Go CLI applications.

Options:
  -f <string>      (required) File path
  -d               Debug mode
  -l <int>         Index of line (default 10)
  -u <string>      URL (default "https://httpbin.org/get")
  -w <duration>    Duration of wait seconds (e.g., 1s, 500ms, 2m) (default 1s)

どうでしょうか? Go 標準の flag パッケージだけにしては結構見やすくなっているのではないでしょうか。 興味があれば、ぜひ詳細を読んでみてください。