xshoji's blog

#Golang

3 posts tagged with Golang

Go 標準の flag パッケージのテクニック集その2: ロングオプションへ対応する

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

の続きです。前回は、Go 標準の flag パッケージで Usage を綺麗に整形する方法を紹介しました。 Usage は見やすくなったのですが、次の要件として、ロングオプションを扱いたい、というのがあります。

Unix系のコマンドラインツールでは、一般的にショートオプション( -f のような1文字のオプション)とロングオプション( --file のような複数文字のオプション)の両方をサポートしていることが多いです。 Go 標準の flag パッケージは、 任意の文字列をフラグ名として定義できるので、ショートオプションとロングオプションの両方を実装上定義することは可能ですが、それらが同じ意味のオプションであることが Usage からは伝わりづらいので、そのままではとても使えません。

前回紹介した有名な spf13/cobraurfave/cli といったフレームワークを使えば簡単に実現できるのですが、 今回はあえて main.go のみで実装することにこだわりたかったため、Go 標準の flag パッケージだけでロングオプションを扱えるようにする方法を試行錯誤してみました。

多少複雑ですが、実用的な実装ができたので、今回はその実装方法について紹介したいと思います。

注意: この記事で紹介するスニペットは Go 1.18以上(Genericsを使用するため) が必要です

続きを読む

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

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

ただ、Go 標準の flag パッケージはコマンドライン引数のパースを簡単に実装できる反面、 Usage の出力があまり綺麗ではなかったり、ロングオプションを扱うのが難しいなど色々使い勝手が悪い部分があります。 先ほど説明した通り、 main.go のみで実装することにこだわりたかったため、これまで、 spf13/cobraurfave/cli のような外部ライブラリを使わずに、どうにかして 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 パッケージだけにしては結構見やすくなっているのではないでしょうか? 興味があれば、ぜひ詳細を読んでみてください。

続きを読む

Goのバイナリにソースコードをそのまま同梱するという提案

はじめに

業務でGoのスクリプトを書いて、バイナリをチームに配ることがよくあります。 Goでコンパイル済みのバイナリを配るメリットとしては

  • 実行環境に依存せずどこでも実行できる

という点かなーと思います。 ただ、デメリットもあって、それは実行するバイナリがどのソースコードから生成されたものか分かりづらいという点です。

続きを読む