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

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/

Yoichiro Shimizu

February 15, 2019
Tweet

More Decks by Yoichiro Shimizu

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  5. What is
    Modules(vgo)
    SECTION ONE

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  9. Semantic Versioning
    Semantic Import Versioningより引用

    View Slide

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

    View Slide

  11. SECTION TWO
    GOPATH mode
    AND
    module-aware mode

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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より引用

    View Slide

  17. go mod command
    AND
    go.mod file
    SECTION THREE

    View Slide

  18. go mod command and go.mod file

    View Slide

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

    View Slide

  20. go mod command and go.mod file

    View Slide

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

    View Slide

  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

    View Slide

  23. Changes
    in Go 1.12
    SECTION FOUR

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide