go/parserでパースしたファイル自身のパッケージパスは取れない
"."でインポートしたパッケージのインポートパスを取得する方法はおそらく無い。例えばGoで静的解析する際のテンプレート(標準版)のようにgo/parser.ParseDir へ "." を渡してパースした場合、
pkgs, err := parser.ParseDir(fset, ".", nil, 0)このとき、pkgs の持っている値から正規の(カノニカルな)パッケージパスを取り出せない。同様に、go/types で提供されている関数を使っても取り出せない。例えば "github.com/lufia/plug/test" を "." でパースした場合、pkg.Name で test を取れるが、 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ファイルのパーサーを使うことになる。