qnighy
@qnighy

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Go言語のパッケージ名 (URLもどき) がコンパイラによって処理されるときの正確なルールが知りたい

Q&A

Closed

以下のようなケースで、Go言語ではパッケージ名としてURLのようなものを指定します。

  • Goソース中の import
  • go.mod 内の require
  • go get の引数

これらの大半は github.com/[username]/[module] で始まり、その場合は https://github.com/[username]/[module].git 上の対応するパスからパッケージが取得されることは経験上わかっています。しかし実際には go.opencensus.io のようにホストパートだけでモジュールを構成したり、 v2 などsemantic import pathが付与されている場合もあります。 (github.com/augustoroman/v8 のようにsemantic import pathと紛らわしそうな名前すらあります。)

そこで、これらのURL(のような何か)がどのような形で特定のgitリポジトリ内の特定のディレクトリーとして解決されるのか、優先順位も含めた正確なルールが知りたいです。できれば、文書化された資料にあたれるのが望ましいですが、コンパイラの実装から読み取れる内容でもかまいません。よろしくお願いします。

0

1Answer

リモートパスの解決ルールは https://golang.org/cmd/go/#hdr-Remote_import_pathsgo help importpath に書いてあります。要約すると、

  • Bitbucket, GitHub, Launchpad, IBM DevOps Services のパスは特別に認識する
    • 例:bitbucket.org/user/project
    • 例:github.com/user/project/sub/directory
  • そうでないとき、ホスト名がピリオドを含まないならエラー(ドキュメントにはないが go1.15.1 で挙動を確認)
  • そうでないとき、ホスト名以降のパスが *.{bzr,fossil,hg,git} に一致するパートを含むなら、 VCS のリポジトリ URL として認識する
    • 例:example.org/user/foo.hg
    • 例:example.org/repo.git/foo/bar
  • そうでないとき、 https://${リモートパス}?go-get=1 に GET リクエストして、レスポンスが特定の形式の meta タグを含むなら、 meta タグで指定されたモジュールプロキシ URL または VCS のリポジトリ URL を採用する
  • 上記のいずれでもなければエラー

となります。また、リモートパスの解決に先立ってローカルのファイルシステムにパッケージがあるか探索するようです。 $GOPATH/{src,pkg} 以下か vendor ディレクトリ にパッケージがあればそれを採用する挙動を確認しました。

4Like

Comments

  1. @qnighy

    Questioner

    なるほど、コマンドリファレンスにあったんですね…… ありがとうございました。

Your answer might help someone💌