Slide 1

Slide 1 text

go get で考慮している ファイルシステムの挙動について Go Conference 2024 @mwudo / 岸田慎之介

Slide 2

Slide 2 text

2 自己紹介 ●  SO Technologies 株式会社 ● Go言語でAPI/バッチ処理の開発を主に行いつつ 問い合わせの調査も行っている グループ横断の取り組みで使うアプリの開発にも従事 ●  毎週ボルダリングに通ってる 岸田 慎之介 @mwudo

Slide 3

Slide 3 text

概要 3 ファイルシステムのとある挙動を go get では どのように考慮しているかコードを交えて紹介 ※ 紹介するコードは 2024/06/07 時点での release-branch.go1.22 の実装 macOS で検証

Slide 4

Slide 4 text

go get の仕組みを簡単に紹介 4

Slide 5

Slide 5 text

go get の仕組みを簡単に紹介 5 タグを指定しない場合を例に 引用:The Go Blog 「Module Mirror and Checksum Database Launched」 1. バージョンのリストを取得 2. 最新のタグのメタ情報を取得 3. 依存関係にある mod ファイル等を取得 4. zip ファイルとしてダウンロード

Slide 6

Slide 6 text

go get の仕組みを簡単に紹介 6 引用:The Go Blog 「Module Mirror and Checksum Database Launched」 1. バージョンのリストを取得 2. 最新のタグのメタ情報を取得 3. 依存関係にある mod ファイル等を取得 4. zip ファイルとしてダウンロード タグを指定しない場合を例に

Slide 7

Slide 7 text

go get の仕組みを簡単に紹介 7 引用:The Go Blog 「Module Mirror and Checksum Database Launched」 1. バージョンのリストを取得 2. 最新のタグのメタ情報を取得 3. 依存関係にある mod ファイル等を取得 4. zip ファイルとしてダウンロード タグを指定しない場合を例に

Slide 8

Slide 8 text

go get の仕組みを簡単に紹介 8 引用:The Go Blog 「Module Mirror and Checksum Database Launched」 1. バージョンのリストを取得 2. 最新のタグのメタ情報を取得 3. 依存関係にある mod ファイル等を取得 4. zip ファイルとしてダウンロード タグを指定しない場合を例に

Slide 9

Slide 9 text

go get の仕組みを簡単に紹介 9 引用:The Go Blog 「Module Mirror and Checksum Database Launched」 1. バージョンのリストを取得 2. 最新のタグのメタ情報を取得 3. 依存関係にある mod ファイル等を取得 4. zip ファイルとしてダウンロード タグを指定しない場合を例に

Slide 10

Slide 10 text

go get の仕組みを簡単に紹介 zip ファイルとしてダウンロードされたあと解凍され ローカル環境にディレクトリ・ファイルが保存される 保存先の OS の ファイルシステムの影響 を受ける 10

Slide 11

Slide 11 text

go get の仕組みを簡単に紹介 macOS だと 11

Slide 12

Slide 12 text

go get の仕組みを簡単に紹介 少なくとも macOS では大文字・小文字を区別しない設定を存在する 大文字・小文字が混在しても go get できる 仕組み が必要 12

Slide 13

Slide 13 text

ファイルシステムの考慮をどのように行っているのか 13

Slide 14

Slide 14 text

ファイルシステムの考慮をどのように行っているのか src/cmd/go/main.go の init 関数で各コマンドを登録 14

Slide 15

Slide 15 text

ファイルシステムの考慮をどのように行っているのか src/cmd/go/main.go の init 関数で各コマンドを登録 お目当てのコマンド 15

Slide 16

Slide 16 text

ファイルシステムの考慮をどのように行っているのか src/cmd/go/internal/modget/get.go 16 go get 時に指定したライブラリを goroutine で取得

Slide 17

Slide 17 text

cmd/go/internal/modload/import.go ファイルシステムの考慮をどのように行っているのか いくつかの処理を経由してライブラリを取得する処理が実行される ・ ・ ・ 17

Slide 18

Slide 18 text

18 ファイルシステムの考慮をどのように行っているのか キャッシュを使いながらダウンロード cmd/go/internal/modfetch/fetch.go

Slide 19

Slide 19 text

ファイルシステムの考慮をどのように行っているのか zip ファイルをダウンロード 19

Slide 20

Slide 20 text

ファイルシステムの考慮をどのように行っているのか 保存するディレクトリを指定 cmd/go/internal/modfetch/cache.go 20

Slide 21

Slide 21 text

ファイルシステムの考慮をどのように行っているのか cmd/vendor/golang.org/x/mod/module/module.go 21

Slide 22

Slide 22 text

ファイルシステムの考慮をどのように行っているのか cmd/vendor/golang.org/x/mod/module/module.go 22 大文字の考慮

Slide 23

Slide 23 text

ファイルシステムの考慮をどのように行っているのか 23 実際に大文字を持つリポジトリ(今回は DataDog)を go get して ダウンロードされるディレクトリ($GOPATH/pkg/mod)を見ると

Slide 24

Slide 24 text

どのように処理の流れを追って理解していったのか (方法の一つとして参考してもらえれば) 24

Slide 25

Slide 25 text

どのように処理の流れを追って理解していったのか ある程度当たりをつけて処理を探した 25 1 今回は go get の挙動についてだったので、 ❏ get が付いているファイル or 関数があるはず ❏ modget というディレクトリに get.go というファイルがあった ❏ 処理を追ってもあまり処理を理解できなかった IDE の力を借りるべく Go の実装を手元にダウンロードした 0

Slide 26

Slide 26 text

どのように処理の流れを追って理解していったのか 関数の引数渡されている変数の情報を確認 26 2 ❏ 難しいことはせず、fmt.Println とかを埋め込んだ ❏ panic を埋め込んでスタックトレースみたり(これが一番理解がすすんだ) ❏ 自分で改造した Go をビルドするのは簡単だった 参考:Install Go

Slide 27

Slide 27 text

go build 時の挙動だったり Go version 1 との比較とかも機会があれば 業務時の軽い雑談で紹介した挙動を偶然見つけて 初めて Go のソースコードを読んだ まとめ GitHub だと大文字・小文字違いのアカウントは作成できないので ほとんど起きない現象なのかもしれない 27

Slide 28

Slide 28 text

❏ The Go Blog 「Module Mirror and Checksum Database Launched」 ❏ GopherCon 2019: Katie Hockman - Go Module Proxy: Life of a Query ❏ Go Module Mirror, Index, and Checksum Database ❏ Macのディスクユーティリティで利用できるファイルシステムフォーマット ❏ Installing Go from source 参考