go.sum に古いパッケージが多数含まれているのはなぜですか? 質問する

go.sum に古いパッケージが多数含まれているのはなぜですか? 質問する

私は一連のプロジェクトに取り組んでおり、依存関係の更新に取り組んでいますが、明確な答えが見つからないことが 1 つあります。それは、生成された sum ファイルに各依存関係の古いバージョンが非常に多くリストされている理由です。

私たちのプロジェクトでは、古いバージョンによっていくつかの脆弱性が導入され、セキュリティ修正を含むパッケージリリースの指示golang.org/x/cryptoによって解決しましたreplaceが、これはあまり適切ではないと感じられ、パッケージの安全でないバージョンに固定される可能性があります。

今、古いバージョンに依存するパッケージを更新しgolang.org/x/crypto、replace ディレクティブを使用してパッケージにループバックして更新を試みましたが、古いパッケージがまだリストされています。

これが私たちのプロジェクトにとって何を意味するのか、また、これらがそもそもなぜ含まれているのかをどうやって知ることができるのか疑問に思っています。

単純なを実行すると、go mod why -m golang.org/x/crypto依存している唯一のプロジェクトはgolang.org/x/crypto更新したプロジェクトであることがわかります。

ベストアンサー1

@JimBはいくつかのドキュメントを提供しました合計する次の声明文

go.sum ファイルには、モジュールの複数のバージョンのハッシュが含まれている場合があります。go コマンドは、最小限のバージョン選択を実行するために、依存関係の複数のバージョンから go.mod ファイルを読み込む必要がある場合があります。go.sum には、不要になったモジュール バージョンのハッシュ (たとえば、アップグレード後) が含まれている場合もあります。go mod tidy は、不足しているハッシュを追加し、go.sum から不要なハッシュを削除します。

そして、go sumで定義されたパッケージの結果セットは、最小バージョンの選択プロセスは深いテーマのようです。

例としては、"google.golang.org/grpc/metadata"モジュールにインポートし、go mod tidyモジュール内で実行すると、結果として得られる sum ファイルの一部は次のようになります。

github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=

バージョンへの各参照は、最小バージョン選択アルゴリズムグラフ内のノードを示します。

modファイルに以下を追加する

replace github.com/golang/protobuf => github.com/golang/protobuf v1.4.3

を実行するとgo mod tidy、protobuf の合計エントリは次のように変わります。

github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=

ディレクティブはすべてのバージョンの置き換えを示しているためreplace、依存関係グラフ内のすべてのノードがv1.4.3に置き換えられ、依存関係の単一バージョンv1.4.3の組み込みが簡素化されます。

脆弱性スキャナーで発生した問題については、その作成者が Golang の依存関係をどのようにチェックすべきかを認識していなかったようで、間接的な依存関係が mod ファイルにリストされている go 1.17 にモジュールをアップグレードしても、sum エントリがプロジェクトに脆弱性のフラグを立てるのを止めることができませんでした。

おすすめ記事