前回の記事(【2019年9月版】Cloud FunctionsでGoをデプロイをする際のエラーメッセージが「go: finding ・・・」だった時の対処方法)のほぼ焼き直しになりますが、個人的にこの間デプロイしたばっかりのプログラムが今日デプロイするとエラーになるというのはトラウマレベルのショックな事件でしたので、再度、事前の対策としてどうしておけばよかったのか?というのをまとめておきたいと思いました。
というわけで、改めてこちらの記事とさせていただきます。
とはいえ、キモは以下の一点です。
Goのバージョンに依存しすぎない、開発環境の構築方法
今回は Go言語での事件でしたが、node.js や python、Java、その他の言語でもありますよね?バージョンの依存。。。
プログラム側の依存は一筋縄ではいきませんが、せめて環境だけでも git clone しなおせばOKなようにしておきたいものです。
そんなわけで、以下ではバージョンに依存しすぎない
Go言語の開発環境の構築手順となります。
尚、対象は Ubuntu となります。また、Cloud Functionsを対象とするため、Goのバージョンは1.11.6、とします。(ちょっと古いですがすいません。)
今回、必要なツールは以下の2つです。
なんと、たったこれだけ。この2つでフレキシブルにイケてしまします。
まずは goenv で go言語ツールキットの切り替えを容易にします。
また同時に GOPATHなどのパスの参照先を楽に切り替えるために、direnvを使用いたします。
goenv のインストール
こちらのページを参考に・・・
といっても clone して goenv init
してパスを通すだけでOKです!
サクッと入れてしまいましょう。
direnv のインストール
direnvも難しいことはありません。https://github.com/direnv/direnv/blob/master/docs/installation.md
インストールして、~/.bashrc
で eval "$(direnv hook bash)"
するだけでございます。
こちらもサクッとインストールしてしまいましょう。
goenv で go のインストール
まずは goenvから1.11.6
をインストールしてみましょう。
$ goenv install 1.11.6
このままでは有効になりませんが・・・まだです!1.11.6を有効にするのはしばらくお待ちください。
続いてGoはビルドするために GOPATHが必要ですが、1.11.6用の GOPATHディレクトリを作成します。
例えば、以下のようにします。
$ mkdir -p ~/go_prj/1.11.6
$ cd ~/go_prj/1.11.6
で、ここでdirenvを有効にします。
まず、以下の .envrcを上記の1.11.6用のディレクトリ直下に作成します。
goenv local 1.11.6
EXPORT GOPATH=~/go_prj/1.11.6
GOROOT ~/.goenv/1.11.6
EXPORT GO111MODULE=on
そして、以下のコマンドでdirenvを有効にします。
$ direnv allow
以上で準備はOKです!
direnv
でトリガーされた .envrc
が勝手に 1.11.6
を有効にしてくれます!
この手順で ~/go_prj/1.11.6
以下のディレクトリでは go 1.11.6 が有効になりました。
goenv で go のバージョンを追加してみる
例えば Cloud Functions が 1.11.7 をターゲットにする日が来るかもしれません。
ご安心ください。上記の手順を 1.11.7 として行えばよいのです。
$ goenv install 1.11.7
...
$ mkdir -p ~/go_prj/1.11.7
$ cd ~/go_prj/1.11.7
で 1.11.7
をインストールしたらGOPATH用のディレクトリを作成し、direnv 用のリソースファイルを作成して・・・
goenv local 1.11.7
EXPORT GOPATH=~/go_prj/1.11.7
GOROOT ~/.goenv/1.11.7
EXPORT GO111MODULE=on
direnv を有効にすればOKです!
$ direnv allow
これで~/go_prj/1.11.7
以下では go 1.11.7が有効になります!
ついでに ~/go_prj/1.11.6
に移動してみると・・・
$ cd ~/go_prj/1.11.6
$ goenv loccal
1.11.6
はい、即座に1.11.6の環境に切り替わります!
もう、いつCloud FunctionsのGoランタイムのバージョンが上がっても怖くありませんね?!
以上とります。
今後、XX言語バージョンの記事を起こすかもしれませんが・・・
xxenvとdirenvを組み合わせるとバージョンの切り替えが楽ちんになりますよ~、ということでした。