Goで複数バージョンを共存させ、Moduleモードで実行する
go1.13からModuleモードが推奨となり、GOPATHを定義しなくても良くなり、
これを機にgoenvを卒業してデフォルトのバージョン管理方法に移行した
go.1.13より前ではGOPATH配下でしかGoを動かせなかったのが、
go.modファイルがあるところはどこでも動くようになるらしい
さらに、パッケージや動作バージョンの管理がgo.modファイルでされるようになるらしい
Macにbrewで入れている最新バージョンがデフォルトで、
検証用として、デフォルトのGoから他のバージョンをインストール&管理するイメージ
デフォルトで使うGoのインストールと準備
まだインストールしていない場合は、goをインストールしておく
自分の環境はMacなのでbrewでインストール
% brew install go
最新バージョンがインストールされていることを確認
これがデフォルトで使うGoとなる
% go version go version go1.17.2 darwin/amd64
インストールされている場合はgoenvを消しておく
% brew uninstall goenv Uninstalling /usr/local/Cellar/goenv/1.15.0... (144 files, 245.4KB)
追加で別バージョンのGoをインストール
追加で別バージョンのGoをインストールしてみる
作業用ディレクトリを作成
% mkdir go1.16.9_test % cd go1.16.9_test
少し古いバージョンのGoをインストールしてみる
どんなバージョンがあるかはこちら で確認できる
https://golang.org/dl/
今回は「go1.16.9」をインストールする
まずはgo get
% go get golang.org/dl/go1.16.9 go: downloading golang.org/dl v0.0.0-20211007222857-6589945b0d11 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'.
go getだけでは使えなく、使おうとするとdowonloadしろと言われる
go getは基本的に管理情報を変えるのみで実際のインストールはしないコマンドだそうな
% go1.16.9 go1.16.9: not downloaded. Run 'go1.16.9 download' to install to /Users/yoshi/sdk/go1.16.9
言われるがままにダウンロード
% go1.16.9 download
これで1.16.9を使えるようになった
% go1.16.9 version go version go1.16.9 darwin/amd64
追加でインストールしたGoのプログラムをModuleモードで動かす
先ほどインストールした1.16.9で、プログラム(main.go)を動かしてみる
まずは、「go mod init」コマンドで、Moduleモードに欠かせない「go.mod」ファイルを作成する
バージョンを指定しないと、デフォルトのGo(brewでインストールしたやつ)で動いてしまうので注意
% go1.16.9 mod init go1.16.9_test go: creating new go.mod: module go1.16.9_test
これで、1.16.9版のgo.modが完成
% cat go.mod module go1.16.9_test go 1.16
例えば、今回はこちらのコードを動かしてみる
https://github.com/fatih/colorというPackageを使っている
% cat main.go package main import ( "github.com/fatih/color" ) func main() { color.Red("hello %s", "world") color.Blue("hello %s", "world") }
この時点では必要Packageをインストールもgo.modに記載もしていないが、
「go mod tidy」コマンドで勝手にプログラムを参照して、go.modファイルをいい感じに書き換えてくれる
「go get 【Package】」でも書き換えてくれるが、go mod tidyの方がよしなにやってくれるので絶対便利
% go1.16.9 mod tidy go: finding module for package github.com/fatih/color go: downloading github.com/fatih/color v1.13.0 go: found github.com/fatih/color in github.com/fatih/color v1.13.0 go: downloading github.com/mattn/go-colorable v0.1.9 go: downloading github.com/mattn/go-isatty v0.0.14 go: downloading golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
go.modの中身を確認すると、https://github.com/fatih/colorを使うことがきちんと記載されている
% cat go.mod module go1.16.9_test go 1.16 require github.com/fatih/color v1.13.0
あとはrunコマンドで無事に実行できることを確認できる
(runコマンドは、実行する際に必要に応じてインストールもやってくれるのでgo.modに書いてあるだけでOK)
% go1.16.9 run main.go hello world hello world
colorはこんな感じで色をつけてくれるPackage
最終的なディレクトリ構成はこんな感じ
(go.sumは自動的に作られるファイル)
% tree . ├── go.mod ├── go.sum └── main.go 0 directories, 3 files
控えめに言って、今風ですごく使いやすいと思った。
さすがアホでも書けるように設計されているGo!
これからちゃんと勉強したい。
以上。