Slide 1

Slide 1 text

The Go gopher was designed by Renée French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. あなたの知らない go listコマンド 2022年03月05日(土) 資料:https://tenn.in/golist

Slide 2

Slide 2 text

上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team

Slide 3

Slide 3 text

go listコマンド ■ Goのパッケージ情報などを表示するコマンド ● https://pkg.go.dev/cmd/go#hdr-List_packages_or_modules ● -fでテンプレートを変更できる(表示する情報を変更できる) ○ text/template形式 ● -mでモジュールの情報を表示 ● -jsonでJSON形式で出力 ● 詳細は go help list コマンドで確認できる 3 go list [-f format] [-json] [-m] [list flags] [build flags] [packages]

Slide 4

Slide 4 text

標準パッケージ一覧 ■ パッケージにstdを指定する ● vendorディレクトリも含む ● go help packagesコマンドでパッケージの指定の仕方が分かる $ go list std | head -10 archive/tar archive/zip bufio bytes compress/bzip2 compress/flate compress/gzip compress/lzw compress/zlib container/heap

Slide 5

Slide 5 text

fmtパッケージを構成するGoファイル ■ フォーマットを指定する ● .GoFilesでビルド対象になる.goファイルが取得される $ go list -f '{{range .GoFiles}}{{.}} {{end}}' fmt doc.go errors.go format.go print.go scan.go

Slide 6

Slide 6 text

パッケージ情報 ■ テンプレートに渡されるデフォルトのデータ ● -fオプションで指定したテンプレートで利用できる ● コマンドライン引数のパスを省略すると現在のパッケージ type Package struct { Dir string ImportPath string // (略) Module *Module // (略) GoFiles []string CgoFiles []string CompiledGoFiles []string IgnoredGoFiles []string // (略) EmbedPatterns []string EmbedFiles []string }

Slide 7

Slide 7 text

モジュール情報 ■ -mオプションを指定すると得られる ● 標準パッケージには使えない ● パスを省略すると現在のモジュール $ go list -m -f '{{.GoVersion}}' 1.17 type Module struct { Path string Version string Versions []string Replace *Module Time *time.Time Update *Module Main bool Indirect bool Dir string GoMod string GoVersion string Retracted string Error *ModuleError }

Slide 8

Slide 8 text

利用できるテンプレート関数 ■ join ● 文字列結合を行う ■ context ● ビルドコンテキストを取得 ■ module ● 指定したパスのモジュール情報を取得 type Context struct { GOARCH string GOOS string GOROOT string GOPATH string CgoEnabled bool UseAllFiles bool Compiler string BuildTags []string ToolTags []string ReleaseTags []string InstallSuffix string } $ go list -f '{{join .GoFiles " "}}' fmt doc.go errors.go format.go print.go scan.go $ go list -f '{{(context).GOOS}}' fmt darwin $ go list -f '{{module "github.com/tenntenn/connpass"}}' fmt github.com/tenntenn/connpass

Slide 9

Slide 9 text

ビルドタグの指定 ■ -tagsオプションで指定する ● GOFLAGS環境変数を設定してもOK $ go list -tags appengine -f "{{(context).BuildTags}}" fmt [appengine] $ GOFLAGS="-tags=appengine" go list -f "{{(context).BuildTags}}" fmt [appengine]

Slide 10

Slide 10 text

バージョンアップ可能なモジュール ■ -uオプションを使用する ● go list -m -u all ● -jsonオプションでJSONで取得できる ○ スクリプトなどから利用しやすい $ go list -m -u all github.com/gostaticanalysis/skeleton github.com/pkg/errors v0.8.1 [v0.9.1] github.com/yuin/goldmark v1.1.32 [v1.4.7] golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 [v0.0.0-20220214200702-86341886e292] golang.org/x/mod v0.3.0 [v0.5.1] golang.org/x/net v0.0.0-20200625001655-4c5254603344 [v0.0.0-20220225172249-27dd8689420f] golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 [v0.0.0-20210220032951-036812b2e83c] golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd [v0.0.0-20220227234510-4e6760a101f9] golang.org/x/text v0.3.0 [v0.3.7] golang.org/x/tools v0.0.0-20200709181711-e327e1019dfe [v0.1.9] golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 [v0.0.0-20200804184101-5ec99f83aff1]

Slide 11

Slide 11 text

デモ

Slide 12

Slide 12 text

自作ツール:knife(ナイフ) ■ go listのように型情報を表示できるツール ● https://github.com/gostaticanalysis/knife ● アーミーナイフのようにマルチに使えるツール ● 指定したパッケージ(Goファイル)に対し静的解析を行う ● 型情報をテンプレートをもとに出力する ● 下の例ではfmtパッケージの関数を表示している ○ grepコマンドでさらにPrintで始まる関数だけ絞っている $ knife -f "{{names .Funcs}}" fmt | grep "^Print" Print Printf Println 参考:http://bit.ly/golangknife 12

Slide 13

Slide 13 text

まとめ ■ go listは便利! ● 色々情報が取れる ● JSONにできるので再利用しやすい