goenv 環境で VS Code を使う時の注意点

 goenv 環境で VS Code を使う時の注意点として、環境変数を指定して VS Code のワークスペースを開かないと、VS Code がプロジェクトで使っている Go のバージョンを正しく認識しない場合があるということがあります。ここでは、それへの対応方法について簡単に説明をします。

 自分の場合は、VS Code の Go 拡張機能については、正しくバージョンを認識しないワークスペースでは基本的に無効としています。これは、日々のメモをしているディレクトリーを含むワークスペースに、たまたま置いた Go のプログラムに対して、VS Code が Go 拡張機能を適用して、不要なエラーメッセージなどを出してきたり、バージョンアップの推奨をしてきたりするのを防ぐためです。

 それで、Go のプログラムを使ったプロジェクトには .go-version ファイルを置いて、使用している Go のバージョンを明示するようにしています。.go-version は goenv 用のファイルですが、go.mod や app.yaml や docker-compose.yml などで明示的にする方法もあるので、このあたりは好みにより採用するファイルを決めれば良いでしょう。自分は Go の開発環境については、GAE/Go も視野に入れて 1.16 や 1.15 を使う環境も手軽に用意ができるようにしていて、goenv を使っています。

 goenv の利用については、「Goでは○○envが不要になった理由(バージョンアップを怠ると損する理由)- tenntenn.dev」という話もあるので、goenv でなくてもうまく対応する方法があるのかもしれませんが、そちらについては調べていないです。

 なお、自分は anyenv 環境での goenv 環境なので、通常の goenv 環境とは若干違うということも承知しておいてください。

 さて、goenv 環境のとき、VS Code の Go 拡張機能は有効にするのですが、環境変数を `go env` で出力してみると、想定している環境変数の値にならず、うまく認識していない場合があります。これについては、VS Code を起動する時に環境変数の GOPATH と GOROOT について正しいものを指定すると大丈夫なようです。

 たとえば、goenv (anyenv) の Go 1.16.15 を使う場合は、次のような感じです。go.code-workspace はワークスペースファイルになります。

GOPATH=${HOME}/go/1.16.15 \
  GOROOT=${HOME}/.anyenv/envs/goenv/versions/1.16.15 \
  code go.code-workspace

 dlv, go-outline, godoc, gomodifytags, goplay, gopls, gotests, impl といったコマンドが各バージョンで共通で使えるものなのかというと微妙な気がしていて、コマンド名に「1.16 とかつけて使う必要がある」とかだと、環境のアップデートをするたびにビルドやデプロイ用のスクリプトなどにも影響が出てきそうな気がしています。スクリプトへの影響は最小限にして、環境利用側の方で明示的に指定して切り替える方が安定するだろうとも考えているので、こういった方法を採用しています。

 そもそも論としては、goenv 以外の選択肢というのもあるわけですが、システムデフォルトについてはパッケージ版を使うのが楽です。Ubuntu だと「Ubuntu · golang/go Wiki · GitHub: https://github.com/golang/go/wiki/Ubuntu」でリポジトリ登録ができるようなので、これを使うのが楽です。自分は、1台の Ubuntu マシンでは、システムにこれをインストールして、バージョンの切り替えが必要なものについては goenv を使うようにしています。

 Go だと、バイナリー版をインストールする方法もあります。「Download and install – The Go Programming Language」にあるように、インストールしたいバージョンの Go のアーカイブをダウンロードして展開するだけなので簡単です。アップデート時には手動になりますが、既存のバージョンの /usr/local/go を全部削除してから同じ作業をするだけです。そうそう、PATH 環境変数に /usr/local/go/bin へのパスを追加するのを忘れないようにしましょう。

 個人用の環境しか触れず、/usr/local へインストールすることができない場合は ${HOME}/.go へインストールすると良さそうです。自分は 1台の Ubuntu マシンでは ${HOME}/app/go にインストールして、バージョンの切り替えが必要なものについては goenv を使うようにしていますが、「https://github.com/golang/go/wiki/Ubuntu」で紹介されている getgo は .go へインストールするようなので、それに合わせておいても良い気がしています。

 それで Docker 版の Go を使う方法もあると思っていて、alias で docker コマンド経由で go コマンドを実行というのでも良さそうな気がしていたり。ただ、それだと VS Code にコマンドを認識させるのが大変になるので、Visual Studio Code Remote Development 拡張機能を使って、開発環境自体を Docker イメージにして、そこで開発をすれば良いのだろうという気もしています。Docker を使う分、リソース利用時にオーバーヘッドが若干発生するということになりそうですが、コンテナ内に開発環境を用意できるというメリットはそれなりにあります。初心者だと、その環境を用意するまでに理解しないといけない事項が多すぎて大変だったりしそうですが、用意されたものを利用するだけなら、それほど違和感なくすぐに使えるようになりそうな気もしています。このあたりは、まだ調べているところです。

 さて、手元には、Go を学ぶための書籍がいくつかあって、どれも中途半端にしか読んでいないのですけど、読み直す時に、最新版に合わせたコードへ修正してから動かすというのはやってられないので、Go のバージョンを手軽に切り替えられる環境というのは必須かなぁ、と思っています。

 具体的に手元にある書籍は次の通りです。持っているだけで、きちんと読めてませんけど。基本事項の確認用に「プログラミング言語Go」は持っていたいところです。他の2冊は、実際に Go を使っている人たちのノウハウを知るために買ってみています。

 O’Reilly Japan からも良い書籍が出ていて、次のものを持っています。オライリージャパン の書籍は電子版がないのですかね。Amazon では紙版しかありませんでした。オライリージャパンのサイトなら電子書籍も入手できそうな気がします。こちらは内容が絞られていて、応用編という感じですね。

 GAE/Go も仕事で使っているので、資料としていくつか書籍を購入してあります。GAE/Go (Google App Engine 上での Go の使用  |  App Engine ドキュメント  |  Google Cloud) の資料としては下記があります。このあたりも時間が経過すると、すぐに陳腐化してしまうのが悩ましいところです。

 ちょっと脱線しますが、GAE/Python で Flask を使っている書籍もあったりします。

 話を戻します。最近のものでは、下記の「ハンズオン」に惹かれて買ってみています。Go で何かのアプリを作ってみるというのは良い考えだと思っていて、実際に動くアプリがあると、わかりやすいですよね。自分の場合、Go 以外で作ることができてしまったりするので「Go で作ることに明らかなメリットがあるアプリ」でないと、なかなか手を動かせないのですけど…

 下記も欲しいのですが、読んでいる時間が取れそうにないという…

 結構な冊数があって、全部 Kindle へ移行したい気持ちもありますが、Kindle にするとさらに読まなくなりそうな予感がするのですよね。なんでだろう。Kindle 用リーダーとしての iPad が古くなって、最近使わなくなっているからかなぁ。

同じタグの記事: Go
同じタグの記事: golang
同じカテゴリの記事: Book
同じカテゴリの記事: General