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

【Go:パッケージ管理】DepからGo Modulesへ

uhzz
March 13, 2022

【Go:パッケージ管理】DepからGo Modulesへ

uhzz

March 13, 2022
Tweet

More Decks by uhzz

Other Decks in Technology

Transcript

  1. - 導入 - もともとのGoのパッケージ管理 - go getについて(Go Modules以前) - vendoringについて

    - Depというパッケージ管理ツール - 現在のパッケージ管理 - Go Modulesという方法 - Go Modulesが解決したこと 今日話すこと - 私たちがやること - go installコマンドを使おう - リリースタグをつけよう - 最新のGoを使おう
  2. GOPATHの構成をざっくり .$GOPATH ├── bin //ビルドされた実行可能プログラム(バイナリ)を格納します ├── pkg //コンパイルされたパッケージを格納します* │ ├──

    mod //Go Modulesを有効にしている場合に利用されます │ │ ├── cache //Go Modulesに関わるキャッシュです │ │ └── github.com └── src //ソースコードを配置します └── github.com └── uh-zz GOPATHは、ワークスペースのルートを定義する変数のことです https://pleiades.io/help/go/configuring-goroot-and-gopath.html 補足: `import foo/bar`とした時の参照先のことです! https://stackoverflow.com/a/15551537
  3. GOROOTの構成をざっくり .$GOROOT ├── bin //ビルドされた実行可能プログラム(バイナリ)を格納します │ ├── go │ └──

    gofmt ├── src //Goの標準パッケージのソースを格納します └── pkg //コンパイルされたパッケージを格納します* ├── darwin_amd64 │ ├── bytes.a* … GOROOTは、Go SDKの場所を定義する変数です https://pleiades.io/help/go/configuring-goroot-and-gopath.html 補足: `import bytes`とした時の参照先です! https://stackoverflow.com/a/15551537 補足: 「基本的なSDKにはライブラリも含まれる」ことから、 ここでは標準パッケージをSDKと呼んでいます https://www.redhat.com/ja/topics/cloud-native-apps/what-is-SDK
  4. 問題点:グローバルな$GOPATH/src .$GOPATH ├── bin ├── pkg └── src └── github.com

    └── uh-zz ├── hogefuga //v2.0.0 ├── packageA //import “github.com/uh-zz/hogefuga” (v1.0.0) → ? ├── packageB //import “github.com/uh-zz/hogefuga” (v2.0.0) → ok グローバルな$GOPATH/srcに最新のソースコードをクローンするので、 バージョン管理ができない(泣) 補足: クローンされたgithub.com/uh-zz/hogefugaがv2.0.0の場合、 「packageA」はv1.0.0を想定しているので、正しくインポートできない
  5. パッケージごとに、依存パッケージをvendorフォルダ配下に用意することで バージョン管理できない問題に対応 vendoringについて .$GOPATH ├── bin ├── pkg └── src

    └── packageA │ └── vendor │ └── github.com │ └── uh-zz │ └── hogefuga //v1.0.0 └── packageB └── vendor └── github.com └── uh-zz └── hogefuga //v2.0.0 if a package or a parent folder of a package contains folder named vendor it will be searched for dependencies using the vendor folder as an import path root. (直訳) パッケージまたはパッケージの親フォルダに、vendorという名前 のフォルダが含まれているとき、vendorフォルダをインポート ルートパスとして使用し、依存関係を検索します https://blog.gopheracademy.com/advent-2015/vendor-folder/
  6. Depというパッケージ管理ツール Go公式の依存関係の管理ツールで以下のように使えます root:/go/src/github.com/uh-zz/hogefuga# dep init root:/go/src/github.com/uh-zz/hogefuga# cat main.go package main

    import ( "github.com/mattn/go-runewidth" ) func main() { println(runewidth.StringWidth("あ")) } root:/go/src/github.com/uh-zz/hogefuga# dep ensure root:/go/src/github.com/uh-zz/hogefuga# GO111MODULE=off go run main.go 2 . |-- Gopkg.lock //dep作成 |-- Gopkg.toml //dep作成 |-- main.go `-- vendor `-- github.com |-- mattn | `-- go-runewidth 補足: dep ensureコマンドを実行すると、vendorディレクトリ配下に 依存パッケージがインストールされる https://mattn.kaoriya.net/software/lang/go/20170125023240.htm
  7. Go1.16からGO111MODULEのデフォルトがonになりました Go1.11から2つのモードが使えるように! GOPATH mode module-aware mode 開発 $GOPATH配下 任意のディレクトリ コード管理

    $GOPATH/src 任意のディレクトリ ビルド管理 $GOPATH/bin 任意のディレクトリ パッケージ管理 リポジトリの最新リビジョンのみ対象 -標準ライブラリを除くすべてのパッケージを モジュールとして管理。 -モジュールはリポジトリのバージョンタグまたは リビジョンごとに管理。 GO111MODULE(環境変数) off on https://go.dev/doc/go1.16#go-command
  8. Go Modulesという方法 .hogefuga //モジュール ├── go.mod ├── main.go ├── packageA

    //パッケージ │ ├── a.go │ └── a_test.go └── packageB //パッケージ ├── b.go └── b_test.go パッケージ Goコンパイラにおける処理単位。物理ディレクトリ内のファイル群を1パッケージとする モジュール module-aware modeでは、標準ライブラリを除くパッケージをモジュールとして管理。 パッケージが単一のディレクトリを指すのに対し、モジュールはgo.modファイルのある ディレクトリ以下のすべてのパッケージがモジュールの対象となる。 モジュールがGithubで管理されている場合は、リビジョン(バージョン)ごとに異なる モジュールとみなされる。 つまり、モジュールの実体は「パッケージ(s)+リビジョン(バージョン)」となる。
  9. またGo1.18から、(module-aware modeでの)go getコマンドには ビルドやインストール機能がなくなる(泣) go installコマンドを使おう # go version go

    version go1.17 linux/amd64 $ go get github.com/mattn/jvgrep/v5@latest go get: installing executables with 'go get' in module mode is deprecated. Use 'go install pkg@version' instead. For more information, see https://golang.org/doc/go-get-install-deprecation or run 'go help get' or 'go help install'. https://tip.golang.org/doc/go1.18 補足: Go1.17では、go getコマンドを使うと警告が出る(けど使える) 警告は、「go getじゃなくて、go installを使ってね」というもの
  10. リリースタグはセマンティックバージョニングで! リリースタグをつけよう require ( github.com/uh-zz/hogefuga v0.0.0-20220119194325-abc123 github.com/uh-zz/fugafuga/config v1.14.0 github.com/uh-zz/nyaooon/service/v2 v1.12.0

    ) モジュールの実体は、「パッケージ(s)+リビジョン(バージョン)」であるから、 リリースタグをつけることには意義がある 補足: タグを付けていない場合も、「v0.0.0-hogehogefugafuaga-hogehoge」のよう にコミット情報から生成されますが、いまいちカッコがつかない (ので、タグをつけた方がイイデスネ) https://semver.org/lang/ja/
  11. - Goのモジュール管理【バージョン 1.17改訂版】https://zenn.dev/spiegel/articles/20210223-go-module-aware-mode - Go: DepからGo Modulesへの移行 https://qiita.com/mikankitten/items/fb06883cc7c0eeb8770f - GOPATHに(可能な限り)依存しないGo開発環境(Go

    1.15版) https://zenn.dev/tennashi/articles/3b87a8d924bc9c43573e - GOPATHを掃除してGo Modulesに移行しよう https://techblog.kayac.com/migration-gopath-to-go-modules - Dep https://github.com/golang/dep - Glide https://github.com/Masterminds/glide - Go 1.13に向けて知っておきたい Go Modulesとそれを取り巻くエコシステム https://syfm.hatenablog.com/entry/2019/08/10/170730 - GOROOTおよびGOPATH https://pleiades.io/help/go/configuring-goroot-and-gopath.html - Understanding and using the vendor folder https://blog.gopheracademy.com/advent-2015/vendor-folder/ - golangオフィシャル謹製のパッケージ依存解決ツール「dep」 https://mattn.kaoriya.net/software/lang/go/20170125023240.htm - Go 1.16 Release Notes https://go.dev/doc/go1.16 - Go 1.18 Release Notes https://tip.golang.org/doc/go1.18 - セマンティックバージョニング 2.0.0 https://semver.org/lang/ja/ - Goでは〇〇envが不要になった理由 (バージョンアップを怠ると損する理由 ) https://tenntenn.dev/ja/posts/2021-06-27-xxenv/ 参考