web-dev-qa-db-ja.com

ローカルでgo modを使用してサブパッケージを使用する

$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ディレクティブ を使用して指示した場合でも、パッケージのローカルファイルシステムバージョンを使用していないことを意味します。

何が悪いのですか?インターネットからフェッチしようとするのではなく、ファイルシステムからサブパッケージが使用されるようにするにはどうすればよいですか?

9
atp

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ファイルはリポジトリルートで停止します。

6
Volker