モジュールのパスがわかるコマンド

secondarykey 2023/08/14 15:52
secondarykey 2023/08/14 16:06

昔はよかった

Go Modulesが出現するまではモジュールは「$GOPATH/src/xxx/xxx/xxx」にありました。そのため簡単にライブラリのサンプルを実行することができましたが、最近は「go get xxx/xxx/xxx」を行うと、モジュールはGoの管理下におかれ正しくバージョン管理されるため、取れたライブラリがGOPATHの奥底になってしまいます。

例)go get golang.org/x/xerrors

存在する場所: D:\Go\PATH\pkg\mod\golang.org\x\xerrors@v0.0.0-20220907171357-04be3eba64a2

このパスにたどり着くまで、モタモタすることが1年に1,2回あるためパスがわかるコマンドを作ってみました。そして作っている過程で

$ go list -m -f {{.Dir}} all

で目標を達成できることがわかりました。 まぁバージョンのリストとかもとれるんで一応公開しておきます。

gopコマンド

gop とコマンドを打つと、そのディレクトリにあるgo.mod

$ gop
D:\Go\PATH\pkg\mod\golang.org\x\mod@v0.12.0
D:\Go\PATH\pkg\mod\golang.org\x\net@v0.14.0
D:\Go\PATH\pkg\mod\golang.org\x\sync@v0.3.0
----省略

内部的には

$ go list -m all

を実行していてそこからファイルパスを予測しています。 go.mod がない位置だとエラーになります。

$ gop
run() error:
gocd.Print() error:
    main.run
        D:/Go/Apps/Tools/gop/_cmd/gop/main.go:58
  - go.mod not found(switch -all).

※書いてて思い出したけど、まだ go.mod の一覧がdownloadされてない場合などにエラーになるかも。そういうディレクトリの場合は go mod tidy とかやる必要があるかも。

パッケージを指定

引数にパッケージを指定した場合、そのパッケージのみを表示します。

> gop golang.org\x\tools
D:\Go\PATH\pkg\mod\golang.org\x\tools@v0.12.0

どういうバージョンがあるのか?(-list)

-list を指定するとそのパッケージの存在するバージョンが表示されます。 利用しているバージョンに"*"がつきます。

>gop -list golang.org/x/tools
golang.org/x/tools:
    0.11.2-0.20230801165449-23c7f589706c => D:\Go\PATH\pkg\mod\golang.org\x\tools@v0.11.2-0.20230801165449-23c7f589706c
  * 0.12.0 => D:\Go\PATH\pkg\mod\golang.org\x\tools@v0.12.0
    0.12.1-0.20230808183815-9abb02c1b552 => D:\Go\PATH\pkg\mod\golang.org\x\tools@v0.12.1-0.20230808183815-9abb02c1b552

パッケージを指定しないで-listを行うと、利用しているパッケージのすべてのバージョンを見ることができます。※使わないと思います

全環境指定(-all)

-all を行うと「管理しているすべてのモジュール」を取得してくれます。 なので「gop -all -list」で検索をすると端末にある全モジュールの表示になります。

利用用途はないと思いますが実装的にはこっちを先に実装して、自分のディレクトリの実装をやったので一応残しておきました。

パッケージ名と物理名の違い

バージョンを指定するパッケージと物理的な位置は違います。 xxxx/xxx/v2/ は xxxx/xxx@v2.x.x となっているはずです。 一応そのあたりも考慮していますが、v2 指定があるときにv2 のみ返すなどがないかな?

そういえばv2 が存在するようなパッケージで、v2指定を行わないパッケージはv1 を返すっていう仕様をいれなければいけない気がしてきました。

latestの考え方

実装していて気付いたんですが、latestの考え方は 「タグを打っているバージョンで最新」であって、コミットの最新ではないってことですね。そのあたりも一応考慮しているつもりです。

ブランチ指定

ブランチ指定している場合とかまだテストしてないかも。。。

ソース

においておきました。 最低限の処理は実装して使えるようにはなったと思っています。

上記の対応とか利用する上で起こった不具合ぼちぼち直していく予定です。 ・・・つか自分の端末でしか動作確認してないので他の環境で動作することを祈っておきます。

The Go gopher was designed by Renee French.

The design is licensed under the Creative Commons 3.0 Attributions license. Read this article for more details:

vertical_align_top