Skip to content

go/parserでパースしたファイル自身のパッケージパスは取れない

"."でインポートしたパッケージのインポートパスを取得する方法はおそらく無い。例えばGoで静的解析する際のテンプレート(標準版)のようにgo/parser.ParseDir"." を渡してパースした場合、

pkgs, err := parser.ParseDir(fset, ".", nil, 0)

このとき、pkgs の持っている値から正規の(カノニカルな)パッケージパスを取り出せない。同様に、go/types で提供されている関数を使っても取り出せない。例えば "github.com/lufia/plug/test""." でパースした場合、pkg.Nametest を取れるが、 pkg.Path. となっている。

go/build を使っても変わらない。こちらはどういうわけか $GOPATH/src からの相対パスが取れる。

package main
import (
"go/build"
"log"
"os"
"path/filepath"
)
func main() {
dir := filepath.Join(os.Getenv("GOPATH"), "mod/dir")
pkg, err := build.Default.ImportDir(dir, 0)
if err != nil {
log.Fatalln(err)
}
log.Println(pkg.ImportPath) // Output: mod/dir
}

"."でも正規のパッケージパスが必要な場合は、おそらくgo.modファイルのパーサーを使うことになる。