rights reserved. 3 もくじ 1. はじめに 2. makefile 3. goinstall 4. go build 5. Go Module 6. module mirror & checksum database (GOPROXY) 7. Go Workspace 8. go mod tools
rights reserved. 12 Makefile だった頃 6g, 6l, 6c, 6a を make で叩くようにする便利スクリプトを配布 # Copyright 2009 The Go Authors. All rights reserved. # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. include $(GOROOT)/src/Make.inc TARG=hello GOFILES=\ hello.go\ hola.go\ include $(GOROOT)/src/Make.pkg
rights reserved. 19 設定より規約 Convention over configuration go get や go build により Makefile の記述や⼿動によるパッケージの配置を排除 Go⾔語の開発当初より実現したかった理想を具現化 About the go command - The Go Programming Language $GOPATH/ pkg/ bin/ src/ main.go github.com/foo/hello hello.go hola.go
rights reserved. 20 パッケージのバージョンに関するFAQ (Go 1.2-1.10) How should I manage package versions using "go get"? ”Go get" does not have any explicit concept of package versions. Versioning is a source of significant complexity, especially in large code bases, and we are unaware of any approach that works well at scale in a large enough variety of situations to be appropriate to force on all Go users. What "go get" and the larger Go toolchain do provide is isolation of packages with different import paths. For example, the standard library's html/template and text/template coexist even though both are "package template". This observation leads to some advice for package authors and package users. 意訳: バージョン管理を導⼊するとおかしくなるから、必要なものの必要な状態はすべてスナップショットを リポジトリに⼊れとけ
rights reserved. 23 局所解としての “go1” タグ 外部に公開するリビジョンを固定し、依存しているパッケージに破壊的変更に対応 する期間を設ける 要約: リポジトリに go1 というブランチやタグがあれば go get の際にそれを取得し、なければ リモートの HEAD を取得する go command - cmd/go - Go Packages (go1.4)
rights reserved. 28 Go teamからのアンサー • dep (2016年3⽉公開) • godep の後継。Go teamによる開発で⾏われた。tomlで依存パッケージ情報を保存。バージョ ン幅に余裕を持たせて指定可能。lockファイルはリビジョンを記録。GOPATHでのディレクト リ構造を踏襲。Go公式のvendorディレクトリに保存。
rights reserved. 31 いろいろ問題を整理した • go get ではバージョン管理の概念がなく、再現性のあるビルドができなかった • go get はリポジトリのリリースタグを無視していた • go get は VCS ツールを⼊れてないとパッケージを取得できなかった • セマンティックバージョンに関して明確なガイドがなかった • vendoringではパッケージのバージョンを管理するためには役に⽴たなかった • 3pツールの互換性がなかった • GOPATHでは複数のバージョンを管理できなかった • GOPATHをプロジェクトごとに使うワークフローがうまく機能しないことがある
rights reserved. 33 Go Modules (Go 1.11-1.13) vgo での学びと成功を受けて Go Modules を正式にリリース • コマンドを go mod として go ツールに統合 • go.mod と go.sum に標準化し、vendorへの依存の廃⽌ • モジュールキャッシュの導⼊ ※ Go 1.11 ではベータリリースで環境変数 GO111MODULE=on にする必要があった。 Go 1.13 からデフォルトが on になり GOPATH モードは⾮推奨に。