Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go Modulesの仕組み Bundler(Ruby)との比較を添えて

doskoi
March 12, 2025

Go Modulesの仕組み Bundler(Ruby)との比較を添えて

Fukuoka.go#21
https://fukuokago.connpass.com/event/344467/
での
『Go Modulesの仕組み Bundler(Ruby)との比較を添えて』
です!

doskoi

March 12, 2025
Tweet

Other Decks in Technology

Transcript

  1. 9 今⽇話すこと • Go Modulesの依存解決の仕組み • Bundler(Ruby)との⽐較 今⽇話さないこと • Go

    Modulesでどこがどう動いてるのか • Bundlerがどこでどう動いてるのか • これらの歴史的な経緯
  2. Go Modulesの仕組み Go Modulesとは • Go 1.11から導⼊ • モジュール:複数のパッケージをまとめてリリース/バージョン管理/配布するための 単位。GitHubやモジュールプロキシサーバからダウンロードが可能

    • モジュールパスによって⼀意に識別してgo.modで宣⾔ • go.sumにモジュールのハッシュが保持され、ダウンロードしたモジュールの内容が 相違ないかチェック 10 https://go.googlesource.com/proposal/+/master/ design/24301-versioned-go.md ref: Go Modules Reference (https://go.dev/ref/mod)
  3. Go Modulesの仕組み module Aでhoge v1.2.3が、 module Bでhoge v1.5.0が使われてる→v1.5.0を採⽤ そぼぎ(素朴な疑問) 15

    けど、なんでmodule Aでは v1.5.0で動く前提なの? Semantic Versioningのルールより モジュールパスが同じなら後⽅互換がある! (逆に⾔えばこれが前提のシステム)
  4. Go Modulesの仕組み そぼぎ(素朴な疑問) 17 じゃあmodule Aではv1.2.3が、module Bではv2.1.0が 使われてる時、v2.1.0を採⽤するの?(A壊れない?) モジュールパスが異なるv1, v2両⽅採⽤する!

    ex) gihub.com/oklog/ulidとgithub.com/oklog/ulid/v2 別モジュールとして扱われるので、 v1.2.3とv2.1.0の両⽅をimportすることで 対処できる
  5. Rubyとの⽐較 • Aでは ◦ Cについて”>= 1.0, < 3.0” • Bでは

    ◦ Cについて”>= 3.0, < 3.5” Bundlerが困る時: 解がないとき 21 最適なバージョンがない場合が発⽣しうる ※ (補⾜) 別gemとして別バージョンを利⽤する⽅法はあるらしい けどGo Modulesはシンプルで⼀意に決まります → 解なし...
  6. ⽭盾の例 • Aでは ◦ Cについて”>= 1.0, < 3.0” • Bでは

    ◦ Cについて”>= 3.0, < 3.5” Rubyとの⽐較 なんでGoだとこうならないの? 22 Goでは、C v1.0とC v3.0を 別モジュールとしてimportできる
  7. ⽭盾の例2 • Aでは ◦ Cについて”>= 1.0, < 1.5” • Bでは

    ◦ Cについて”>= 1.6, < 2.0” Rubyとの⽐較 なんでGoだとこうならないの? 23
  8. ⽭盾の例2 • Aでは ◦ Cについて”>= 1.0, < 1.5” • Bでは

    ◦ Cについて”>= 1.6, < 2.0” Rubyとの⽐較 なんでGoだとこうならないの? 24 Semantic Versioningの後⽅互換の前提があるので マイナーバージョンの上限を指定しないので起こらない → v1.6になる