Go Modules in Go1.12

Go Modules in Go1.12

Go 1.12 Release Partyの資料です。

Go 1.12 Release Party in Tokyo w/ Fukuoka&Umeda
https://gocon.connpass.com/event/118022/

詳細はブログにまとめてあります。
https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/

Eb6be531bcfaa99714d8d3b48665a5a9?s=128

Yoichiro Shimizu

February 15, 2019
Tweet

Transcript

  1. Go Modules in Go1.12 Go 1.12 Release Party, FEB 15

    2019 Yoichiro Shimizu freee k.k. @budougumi0617
  2. 自己紹介 • 清水 陽一郎 @budougumi0617 ◦ Backend Engineer ◦ Go

    / Ruby • Blog ◦ https://budougumi0617.github.io/ • 自作キーボード(来週4台目つくる)
  3. 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
  4. Today's goal • Modulesの概要を知る • Go1.12でModulesの何が変わったのか知る • Modulesの情報のありかを知る

  5. What is Modules(vgo) SECTION ONE

  6. • 新しい依存パッケージのバージョン管理構想 • 2018年2月にRuss Cox-sanが発表 ◦ Go & Versioning |

    research!rsc • 当初はvgoとして提供 ◦ https://github.com/golang/vgo • Go1.11からはGo本体に試験的に導入されている About Go Modules
  7. • 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
  8. • Semantic Versioningに基づいたバージョン管理 ◦ Semantic Versioningの概要は次のページ • Go Modulesは可能な限り古いバージョンを採用する Minimal

    Version Selection
  9. Semantic Versioning Semantic Import Versioningより引用

  10. Minimal Version Selection Minimal Version Selectionより引用

  11. SECTION TWO GOPATH mode AND module-aware mode

  12. • Go1.11/1.12では2つのモードがある ◦ GOPATH mode ◦ module-aware mode Go Modules

    has 2 modes
  13. • GOPATH mode ◦ バージョン 1.10 までと同じ挙動をする ◦ 標準pkg以外を全部 GOPATH

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

    Modules has 2 modes
  15. • GO111MODULEという環境変数で切り替わる。 ◦ off ▪ 常にGOPATH modeで動作する ◦ on ▪

    常にmodule-aware modeで動作する ◦ auto (Go1.11のデフォルト) ▪ $GOPATH 配下ではGOPATH mode ▪ それ以外のディレクトリではmodule-aware mode Go Modules has 2 modes
  16. 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より引用
  17. go mod command AND go.mod file SECTION THREE

  18. go mod command and go.mod file

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

  20. go mod command and go.mod file

  21. • module ◦ ルートディレクトリのモジュール名 • require ◦ 必要なモジュール名とバージョン名を指定する • exclude

    ◦ 明示的に除外するモジュールを指定する • replace ◦ requireで指定したモジュール名を置き換える Directives in go.mod
  22. • 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
  23. Changes in Go 1.12 SECTION FOUR

  24. • 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
  25. • 検証用コード ◦ https://github.com/budougumi0617/gomodules-explore • DockerのGo1.11.5/Go1.12rc1イメージで差異を確認 • module-aware mode(GO111MODULE=on)で確認 Changes

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

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

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

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

    ようになりました(exmaple.com/vの部分のreplace) replaceでバージョン別にディレクトリを指定できるようになった
  30. Go1.11 ビルドができない replaceでローカルのディレクトリを参照できるようになった replaceでバージョン別にディレクトリを指定できるようになった

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

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

  33. Today's summary • ModulesとGoの依存管理をまとめた • Go1.12の関連変更内容をまとめた • Go1.13からModulesがdefault onに •

    まずは自分のリポジトリでgo mod init