· golang Go言語

あなたがGOROOTを本当に設定しなくていい理由

  • このエントリーをはてなブックマークに追加

この記事は、Dave Cheneyさんの記事You don’t need to set GOROOT, reallyの非公式翻訳です。詳細は上記記事をご参照下さい。

This post is the Japanese translated post of Dave Cheney’s post.

はじめに

これは、Goをコンパイルしたりするとき、なぜ $GOROOTを設定しておく必要がないかを説明するという短いポストになります。

TL;DR

Go1.0とそれ以降のバージョンでコンパイルして使うとき、一般には[1]$GOROOT環境変数を設定する必要はありません。

実際には、使うコンピュータにGoの複数のバージョンがあるなら、$GOROOTを設定すると、プログラムをデバッグしにくくなります。

$GOPATHを設定する必要があります。Go1.0以降強く推奨されていまして、Go1.1リリースでは、必須となりました。

なぜGOROOTは、もはや必要とされないのでしょうか?

まだこの記事読んでますか?すばらしい。さて、いくつかの経緯がありました。

Goの環境変数について

Goを昔からやっていた人は、$GOROOTだけなく、$GOOSと$GOARCHの環境変数が必要だった時代を覚えているかもしれません。これらはMakefileがビルドシステムの基盤となっていたため必要でした。たくさんのインクルードが使われており、そのベースパスとして$GOROOTが使われていました。

go toolが導入されたことによって、Go 1.0以降、$GOOSと$GOARCHはオプションとなりました。ビルドスクリプトがホストのOSやCPUアーキテクチャを検出できるようにしました。Go1.0のリリースで、cmd/distのビルドツールの導入で
$GOOS,$GOARCHが真のオプションになりました。これらは今はクロスコンパイルするときだけ使われます。

Go1.0は、ワークスペースをベースとなった$GOPATHを導入しました。ここまで読んできた方は、$GOPATH ワークスペースが何であるかをおそらくわかっていると思います。しかし、分からない場合は、golang.orgのドキュメントかこちらの動画を参照して下さい。

$GOOSや$GOARCHが必要ないことは分かった。けど、$GOROOTについては?

$GOROOTはいつも、Goインストールしたルートへの参照として定義されてきました。ビルドシステムに基づいた古いMakefileでは、これはベースパスとして使われていました。Go1.0から($GOPATH/pkg/tool/$GOOS_$GOARCH/に保存された)コンパイラや($GOPATH/pkg/$GOOS_$GOARCH/にある)標準ライブラリを探すgo toolで使われています。もしあなたがjavaユーザーなら、$GOROOTは$JAVA_HOMEに似ています。

Goをソースからコンパイルするとき、$GOROOTの値は自動的に発見され[2]、ソースツリーからgo toolの中に埋め込まれました。go envを実行するとこのことを確認することができます。

% echo $GOROOT

% go env GOROOT
/home/dfc/go

あなたがウェブサイトhttps://golang.org/dl/からダウンロードしたのがバイナリディストリビューションかあるいは、あなたのOSディストリビューションからインストールした場合、go toolのバイナリへ埋め込まれた正しい$GOROOTの設定値を持っています。

% dpkg -l golang-{go,src} | grep ^ii
ii golang-go 2:1-5 Go programming language compiler
ii golang-src 2:1-5 Go programming language compiler - source files
% which go
/usr/bin/go
% go env GOROOT
/usr/lib/go

go toolが /usr/bin/goにインストールされ、$GOROOTが /usr/lib/goとして埋め込まれているのが分かります。

それで、なんで $GOROOTは設定すべき出ないの?

$GOROOTはもはや設定すべきではありません。なぜなら、正しい設定値がすでに go toolに埋め込まれているからです。

$GOROOTを設定することは、go toolに保存されている値を上書きすることになります。別のバージョンからコンパイラと標準ライブラリを参照するGoのバージョンからgo toolへと移行しています。

あなたが$GOROOTの環境変数を設定しなければならいかもしれないところは、2つの場合のみです。両方のケースともにgolang.orgのウェブサイトのインストレーションページに記載されています。完全性のためにここでそれらをおさらいします。


  1. Goのバイナリディストリビューションを使う場合、必要される2つのケースがあります。それはこのポストで説明します。
  2. これは、あなたが$GOROOTを設定していない場合です。all.bashの親ディレクトリが$GOROOTにマッチしないとき、ビルドシステムが検出しますが。
      • このエントリーをはてなブックマークに追加
      • LinkedIn
      • Tumblr
      • Reddit
      • Google+
      • Pinterest
      • Pocket