($GOPATH
ではなく)ファイルシステムにbitbucket.org/me/awesome
という名前のgoパッケージがあります。
~/awesome> tree
.
├── main.go
├── go.mod
├── go.sum
├── subpackageA
│ └── main.go
私のgo.mod
は次のようになります:
module bitbucket.org/me/awesome
require (
... # lots of external dependencies
)
replace bitbucket.org/me/awesome => ./
トップレベルディレクトリのmain.go
で、次のようにサブパッケージを呼び出します。
import "bitbucket.org/me/awesome/subpackageA"
これはすべてかなり正常に見えます。 go get
は機能します。ただし、このリポジトリ全体を別の場所(Dockerイメージなど)に複製し、go get
を初めて実行すると、次のようなエラーが発生します。
package bitbucket.org/me/awesome/subpackageA: https://api.bitbucket.org/2.0/repositories/me/awesome?fields=scm: 403 Forbidden
、
これは、go.mod
ファイルで replace
ディレクティブ を使用して指示した場合でも、パッケージのローカルファイルシステムバージョンを使用していないことを意味します。
何が悪いのですか?インターネットからフェッチしようとするのではなく、ファイルシステムからサブパッケージが使用されるようにするにはどうすればよいですか?
Goには、「サブパッケージ」という(実際の)概念はありません。すべてのパッケージは基本的に同等に扱われます。つまり、replace bitbucket.org/me/awesome
はパッケージに影響しませんbitbucket.org/me/awesome/subpackageA
これらは2つの個別の無関係なパッケージであるためです。フォルダーレイアウトは、subpackageAと素晴らしい関係、またはその逆の関係を導入していません*)。
したがって、subpackageAの個別の置換ディレクティブを追加する必要があります
replace bitbucket.org/me/awesome/subpackageA => ./subpackageA
*)絶対的な正確さの手探り:internal
(他のプロジェクトからインポートできない)という名前のフォルダー、vendor
(ベンダーのパッケージが含まれている可能性がある)という名前のフォルダー、およびgo.mod
ファイルはリポジトリルートで停止します。