go モジュールのバージョンによって go.sum に 2 行が必要になる場合があるのはなぜですか

okwaves2024-01-25  7

個々のモジュール バージョンで go.sum に 2 行が必要になる場合があるのはなぜですか?

1 行はモジュールのバージョンのみを示します (以下の例では v0.1.1)。 1 行には、バージョンに /go.mod が付加されています (以下の例では v0.1.1/go/mod)。

例:

github.com/foo/bar v0.1.1 h1:kDgnGXZpvZUi7ym6Rm23yVn3gRqBag+vU6M/wytZR9c=
github.com/foo/bar v0.1.1/go.mod h1:MZcarCLffCxoj/EF1yhRb4HvOSmCkm5Z8FPmzWrMG+g=

私が尋ねる理由は、パッケージを取得するときに、上記の例の 2 行目だけで間接的な依存関係が go.sum に生成され、その package@ の 410 が消えてビルドが失敗することがあるためです。バージョン。ただし、手動で間接依存関係を取得すると、410 がなくなってビルドが失敗することはなくなりました。

これはプライベート リポジトリでのみ発生すると思うので、sum.golang.org ではうまく動作しないことは理解しています。ただし、この問題を回避できるかどうかを考えたいと思います。まず、特に自動モジュール更新などに関しては 410 です。

2

golang.org/ref/mod#authenticating の go.sum セクションを読んでください。 v0.1.1/go.mod は go.mod ファイル自体のハッシュであり、もう 1 つは「ソース コード」のハッシュです。表示されている問題は、2 つの行が存在することとは何の関係もありません。

– フォルカー

2020 年 9 月 3 日、11:18

返信ありがとうございます @Volker。私の質問が曖昧で申し訳ありませんでした。 2つの行の違いが分かりました。しかし、go get では間接的な依存関係を構築するのに十分な情報が得られないのに、間接的な依存関係を直接取得すると、ビルドを実行するのに十分な情報が得られる理由がわかりません。興味深いことに、1 行の存在が直接の原因ではないとしても、2 行の存在によって問題は実際に解決されるため、私の質問の表現が決まりました。

– ズビン

2020 年 9 月 3 日 12:29

1

go get はデフォルトで最新バージョンを取得しますが、これは依存関係で必要なバージョンとは異なる場合があります。失敗したコマンドを正確に確認しないと、実際には役に立ちません。

– ピーター

2020 年 9 月 3 日 12:56

1

これは go コマンドのバグである可能性があります。 go1.16rc1 でもまだ問題が発生する場合は、golang.org/issue/new で新しい問題 (再現手順付き) を開いてください。

– bcミルズ

2021 年 2 月 12 日 21:14



------------------------

v0.1.1/go.mod エントリには、go.mod ファイルのチェックサムが単独で含まれています。これは、依存関係をロードまたは変更するときに一貫性を確保するために必要です。

v0.1.1 エントリ (/go.mod サフィックスなし) には、モジュール内のパッケージのすべての .go ソース ファイルを含む、モジュールの完全なソース コードのチェックサムが含まれています。

2 つの部分は別々にダウンロードされるため、ビルドまたはテストする予定のない依存関係の完全なソース コードをダウンロードする必要はありません (一時的な貢献者がいるプロジェクトではよくある状況です)。ただし、 go コマンドはそれらを個別にダウンロードするため、それらに対して個別のチェックサムが必要です。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。