Slide 1

Slide 1 text

Go Modules in Go1.12 Go 1.12 Release Party, FEB 15 2019 Yoichiro Shimizu freee k.k. @budougumi0617

Slide 2

Slide 2 text

自己紹介 ● 清水 陽一郎 @budougumi0617 ○ Backend Engineer ○ Go / Ruby ● Blog ○ https://budougumi0617.github.io/ ● 自作キーボード(来週4台目つくる)

Slide 3

Slide 3 text

Today’s contents Introduction 00 What is Modules(vgo) GOPATH mode & module-aware mode go mod command & go.mod file 01 02 03 04 Changes in Go 1.12 Today’s summary 05

Slide 4

Slide 4 text

Today's goal ● Modulesの概要を知る ● Go1.12でModulesの何が変わったのか知る ● Modulesの情報のありかを知る

Slide 5

Slide 5 text

What is Modules(vgo) SECTION ONE

Slide 6

Slide 6 text

● 新しい依存パッケージのバージョン管理構想 ● 2018年2月にRuss Cox-sanが発表 ○ Go & Versioning | research!rsc ● 当初はvgoとして提供 ○ https://github.com/golang/vgo ● Go1.11からはGo本体に試験的に導入されている About Go Modules

Slide 7

Slide 7 text

● Modules登場以前は以下の手法が取られていた ○ go get ■ go1タグ・ブランチor最新masterブランチ ○ glideやdepなどのサードパーティ製ツール ■ https://github.com/Masterminds/glide ■ https://github.com/golang/dep ● 最近までdepが主流だった…? ○ 2018/06くらいはvgoはまだ辛い記事などがあったり… Before Go Modules

Slide 8

Slide 8 text

● Semantic Versioningに基づいたバージョン管理 ○ Semantic Versioningの概要は次のページ ● Go Modulesは可能な限り古いバージョンを採用する Minimal Version Selection

Slide 9

Slide 9 text

Semantic Versioning Semantic Import Versioningより引用

Slide 10

Slide 10 text

Minimal Version Selection Minimal Version Selectionより引用

Slide 11

Slide 11 text

SECTION TWO GOPATH mode AND module-aware mode

Slide 12

Slide 12 text

● Go1.11/1.12では2つのモードがある ○ GOPATH mode ○ module-aware mode Go Modules has 2 modes

Slide 13

Slide 13 text

● GOPATH mode ○ バージョン 1.10 までと同じ挙動をする ○ 標準pkg以外を全部 GOPATH 以下のディレクトリで管理する ○ パッケージの管理はリポジトリの最新リビジョンのみが対象となる Go Modules has 2 modes

Slide 14

Slide 14 text

● module-aware mode ○ 標準pkg以外の全てのパッケージをモジュールとして管理する ○ モジュールの管理やビルドが任意のディレクトリで可能になる ○ モジュールはリポジトリのバージョンタグ/リビジョン毎に管理 Go Modules has 2 modes

Slide 15

Slide 15 text

● GO111MODULEという環境変数で切り替わる。 ○ off ■ 常にGOPATH modeで動作する ○ on ■ 常にmodule-aware modeで動作する ○ auto (Go1.11のデフォルト) ■ $GOPATH 配下ではGOPATH mode ■ それ以外のディレクトリではmodule-aware mode Go Modules has 2 modes

Slide 16

Slide 16 text

default is “auto” on Go1.12 Go 1.12, scheduled for February 2019, will refine module support but still leave it in auto mode by default. Our aim is for Go 1.13, scheduled for August 2019, to enable module mode by default (that is, to change the default from auto to on) and deprecate GOPATH mode. Go Modules in 2019より引用

Slide 17

Slide 17 text

go mod command AND go.mod file SECTION THREE

Slide 18

Slide 18 text

go mod command and go.mod file

Slide 19

Slide 19 text

● コマンドの使い方あまり載ってないかも…? ● goコマンド用のテストケースを見ると参考になる ○ cmd/go/src/cmd/go/testdata/script go mod command

Slide 20

Slide 20 text

go mod command and go.mod file

Slide 21

Slide 21 text

● module ○ ルートディレクトリのモジュール名 ● require ○ 必要なモジュール名とバージョン名を指定する ● exclude ○ 明示的に除外するモジュールを指定する ● replace ○ requireで指定したモジュール名を置き換える Directives in go.mod

Slide 22

Slide 22 text

● go modで取得したバイナリのありか ○ $GOPATH/pkg/mod/以下にキャッシュされている ● Modulesを利用したCIのプラクティス ○ timakin/go-module | CircleCI Orbs Registory ○ GitHub Actions で Go 1.11 Modules のキャッシュを使う方法 ● go mod tidyコマンドで不要な依存関係を削除 ○ 何気ないgo getがgo.modを傷つけている Tips 発表後@songmuさんから指摘いただきました。 tidyは「ティディ」ではなく「タイディ」と読むそうです。 https://twitter.com/songmu/status/1096368547146559493

Slide 23

Slide 23 text

Changes in Go 1.12 SECTION FOUR

Slide 24

Slide 24 text

● Go 1.12 Release Notes ○ https://tip.golang.org/doc/go1.12 ● 大きく4つ ○ モジュール管理外でもgo getなどができるようになった ○ go env GOMODが/dev/nullを報告する ○ go.modに言語バージョンが保存される。 ○ replaceでローカルのディレクトリを参照できるようになった ○ replaceでバージョン別にディレクトリを指定できるようになった Changes in the release notes

Slide 25

Slide 25 text

● 検証用コード ○ https://github.com/budougumi0617/gomodules-explore ● DockerのGo1.11.5/Go1.12rc1イメージで差異を確認 ● module-aware mode(GO111MODULE=on)で確認 Changes in the release notes

Slide 26

Slide 26 text

Go1.11 go.modがないディレクトリで go getをすると失敗していた Go 1.12 解消された。 モジュール管理外でもgo getなどができるようになった

Slide 27

Slide 27 text

GOMODは参照しているgo.modファイルを示す変数 Go1.11 go.modが見つからないと空文字列 Go 1.12 /dev/null(nullデバイス)を返す go env GOMODが/dev/nullを報告する

Slide 28

Slide 28 text

Go1.11 go.mod内に goディレクティブが存在しない Go 1.12 goディレクティブが存在 go.modに言語バージョンが保存される 02. Start and Execute test

Slide 29

Slide 29 text

import pathとは異なる場所から Modulesを読み込めるようになった replaceの定義だけを書いたgo.modを用 意してgo buildしてみる replaceでローカルのディレクトリを参照できるようになった 発表後@hajimehoshiさんから指摘いただきました。 Go1.11からローカルディレクトリの参照はできていた。 Go1.12ではバージョンごとに参照先のディレクトリを変更できる ようになりました(exmaple.com/vの部分のreplace) replaceでバージョン別にディレクトリを指定できるようになった

Slide 30

Slide 30 text

Go1.11 ビルドができない replaceでローカルのディレクトリを参照できるようになった replaceでバージョン別にディレクトリを指定できるようになった

Slide 31

Slide 31 text

Go1.12 ビルドができる requireが自動生成される replaceでローカルのディレクトリを参照できるようになった replaceでバージョン別にディレクトリを指定できるようになった

Slide 32

Slide 32 text

Today's goal ● Modulesの概要を知る ● Go1.12でModulesの何が変わったのか知る ● Modulesの情報のありかを知る

Slide 33

Slide 33 text

Today's summary ● ModulesとGoの依存管理をまとめた ● Go1.12の関連変更内容をまとめた ● Go1.13からModulesがdefault onに ● まずは自分のリポジトリでgo mod init