📝

Goでは○○envが不要になった理由(バージョンアップを怠ると損する理由)

2021/06/26に公開

Goでは○○env系のツールは不要

複数バージョンの処理系を混在させるために、○○env系のツールが広く普及している言語はたくさんあります。しかし、すべての言語で必ずしも必要であるわけではないと筆者は考えています。いままで使っていた言語で○○env系のツールを使っていたため、特に深く考えずに他の言語でも利用しているということはあるでしょう。

Goでも○○env系のツールはいくつか存在します。しかし、筆者はGoにおいて複数バージョンのツールチェイン(コンパイラや標準ライブラリ)を混在させる必要があるのは稀でしょう。また、混在させる必要あったとしても公式で方法を提供しているため○○env系のツールは不要です。

むしろ、goenvを使っていてうまく動かない。PATHの設定がうまくいかないなどのトラブルをよく見かけます。(そんな方が検索に引っ掛けてくれることを祈っています)。

Goの後方互換性

Goはv1.0をリリースした際に、後方互換についてルールを定めました。2012年以降、リリースサイクルに従って半年に1度(2月と8月)のペースでバージョンアップを重ねていますが、いずれもマイナーバージョンアップです。つまり、Go1.19現在、この10年間で言語仕様や標準パッケージの後方互換性が崩されることはありませんでした。

Go1.18でジェネリクス(型パラメタ)FuzzingWorkspaceの機能が入りましたがGo 1.xの間は後方互換性が崩れませんでした。

このようにGoは後方互換性が保たれているため、バージョンアップを躊躇する必要はあまりないでしょう。むしろ、バージョンアップを怠るとコミュニティの標準とズレが出てくるため保守が難しくなるでしょう。リリースサイクルに合わせてβ版やRC版をうまく利用しながら順次新しいバージョンに以降していくと良いでしょう。まずはCIやステージング環境のGoのバージョンだけをアップする方法もあります。

常にバージョンアップを行う状況になれば、もはやプロジェクト毎にGoのバージョンを固定し、開発マシンにバージョンを混在させる必要はなくなります。○○env系のツールが必要となることはないでしょう。

しかし、Google App Engineなどを利用している場合などのクラウドサービスの都合でバージョンを固定する必要があるかもしれません。その場合は次に説明する公式が提供している方法を用いるとよいでしょう。

複数バージョンのツールチェインを混在させる

Goには複数バージョンのツールチェインを混在させる方法が公式で提供されています。例えば、Go 1.10.7のツールチェインを別途インストールしたい場合には、次のようにgo install[1]することで行なえます。

$ go install golang.org/dl/go1.10.7@latest
$ go1.10.7 download

go1.10.7 downloadコマンドで標準パッケージや周辺ツールをダウンロードします。go1.10.7コマンドは通常のgoコマンドと同じように扱えます。

$ go1.10.7 version
go version go1.10.7 linux/amd64

GOROOTなどの環境変数を取得したい場合は、次のようにgo envコマンドを利用しましょう。

$ go1.10.7 env GOROOT

この方法は、β版を試す際にも便利です。例えば、Go 1.17のBeta1を利用するには以下のように実行できます。一足早く新しい機能を試すことができます。

$ go install golang.org/dl/go1.17beta1@latest
$ go1.17beta1 download
$ go1.17beta1 doc testing.T.Setenv
package testing // import "testing"

func (t *T) Setenv(key, value string)
    Setenv calls os.Setenv(key, value) and uses Cleanup to restore the
    environment variable to its original value after the test.

    This cannot be used in parallel tests.

さらに開発版のツールチェインを試すことが可能です。次のように、gotip downloadコマンドに利用したいブランチを指定できます。省略するとmasterブランチになります。

$ go install golang.org/dl/gotip@latest
$ gotip download dev.fuzz

どんどんバージョンアップをしよう

このように、○○env系のツールを使わず、どんどん新しいバージョンにアップして新しい機能を利用しましょう!グズグズしているとGo1.18でジェネリクス(型パラメタ)、Fuzzing、Workspaceなどが入るかもしれませんよ(リリースがずれたり、プロポーザルが承認されない場合もあります)!!

なお、○○env系のツールは公式における複数バージョンをインストールする方法が登場するより前に開発されたものもあります。多くの開発現場で用いられてきたことは間違いないので、感謝と経緯を払いたいと思います。ありがとうございました。

脚注
  1. Go1.16より低い場合はgo getコマンドを用います ↩︎

Discussion