[インデックス 11664] ファイルの概要
このコミットは、Go言語のmacOS向けパッケージングプロセスにおける環境変数GOROOT
の設定方法と、ユーザーのプロファイルファイル(.bashrc
, .zshrc
など)の変更に関するものです。具体的には、GoツールがGOROOT
パスを内部的に持つようになったため、インストール時に明示的にGOROOT
環境変数を設定したり、ユーザーのシェルプロファイルファイルを変更したりする必要がなくなったことを反映しています。これにより、Goのインストールプロセスがよりクリーンになり、ユーザーのシステムへの影響が最小限に抑えられます。
コミット
commit d887a31b7c7234c560072191e4fc2146be416c29
Author: Andrew Gerrand <adg@golang.org>
Date: Tue Feb 7 10:38:10 2012 +1100
misc/osx: don't set GOROOT or modify profile files
There's no reason to set GOROOT as the tools will have the path baked
into it with GOROOT_FINAL.
R=bradfitz, bytbox, gustavo, rsc
CC=golang-dev
https://golang.org/cl/5576064
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d887a31b7c7234c560072191e4fc2146be416c29
元コミット内容
このコミットは、Go言語のmacOS向けインストーラーが、GOROOT
環境変数を設定したり、ユーザーのシェルプロファイルファイルを変更したりする動作を停止することを目的としています。コミットメッセージには「ツールがGOROOT_FINAL
でパスを内部に焼き付けるため、GOROOT
を設定する理由はない」と明記されています。
変更の背景
Go言語の初期のバージョンでは、Goのツールチェイン(コンパイラ、リンカなど)がGoの標準ライブラリやツールがどこにあるかを知るために、GOROOT
環境変数を設定する必要がありました。しかし、Goのビルドシステムが進化し、Goのツール自体がコンパイル時にGOROOT
の最終的なパス(GOROOT_FINAL
)を内部に埋め込むことができるようになりました。
この変更の背景には、以下の点が挙げられます。
- インストールプロセスの簡素化とクリーンアップ: ユーザーのシェルプロファイルファイル(例:
.bashrc
,.zshrc
,/etc/profile
など)を自動的に変更することは、予期せぬ副作用を引き起こしたり、ユーザーが自身の環境設定を管理する上で混乱を招いたりする可能性がありました。GOROOT
の設定が不要になることで、インストーラーはこれらのファイルを変更する必要がなくなり、よりクリーンなインストールが可能になります。 - 環境変数の依存関係の削減: ツールが自身の依存するパスを内部的に持つことで、外部の環境変数に依存する度合いが減り、システムのセットアップがより堅牢になります。ユーザーが誤って
GOROOT
を設定し忘れたり、間違った値を設定したりしても、Goツールは正しく動作するようになります。 - Goツールの自己完結性: Goツール自体が自身の実行に必要な情報を内包することで、より自己完結性が高まり、配布や利用が容易になります。
このコミットは、Goのビルドシステムが成熟し、GOROOT
の概念が進化する過程の一部を示しています。
前提知識の解説
このコミットを理解するためには、以下の概念を把握しておく必要があります。
-
GOROOT:
GOROOT
は、Goのインストールディレクトリのルートパスを示す環境変数です。Goのソースコード、標準ライブラリ、およびGoツールチェイン(コンパイラ、リンカなど)が配置されている場所を指します。初期のGoバージョンでは、Goコマンドを実行する際にこの変数が設定されている必要がありました。例えば、/usr/local/go
にGoがインストールされている場合、GOROOT
は/usr/local/go
に設定されます。 -
GOROOT_FINAL:
GOROOT_FINAL
は、Goのビルドプロセスで使用される特別な変数です。これは、Goツールが最終的にインストールされるパスをコンパイル時にツール自体に「焼き付ける(bake in)」ために使用されます。つまり、Goのバイナリがビルドされる際に、そのバイナリが実行時にGoの標準ライブラリやその他のリソースを見つけるための絶対パスが、バイナリの内部にハードコードされるのです。これにより、GoツールはGOROOT
環境変数が設定されていなくても、自身の依存するファイルを見つけることができます。 -
シェルプロファイルファイル: Unix系OS(macOSを含む)では、ユーザーがログインしたり新しいシェルセッションを開始したりする際に、特定のスクリプトが自動的に実行されます。これらは「シェルプロファイルファイル」と呼ばれ、環境変数の設定、エイリアスの定義、関数のロードなど、ユーザーのシェル環境をカスタマイズするために使用されます。一般的なものには、Bashの
.bashrc
や.profile
、Zshの.zshrc
、Cshの.cshrc
や.login
などがあります。 -
package.bash
とpostinstall
スクリプト: Goのソースコードリポジトリ内のmisc/osx
ディレクトリには、macOS向けのGoインストーラーパッケージをビルドするためのスクリプトが含まれています。package.bash
: GoのソースコードからmacOSインストーラーパッケージ(.pkg
ファイル)をビルドするためのメインスクリプトです。Goのコンパイル、パッケージの作成、一時ディレクトリの管理などを行います。postinstall
: macOSインストーラーパッケージがインストールされた後に実行されるスクリプトです。通常、インストール後の最終的な設定やクリーンアップ作業を行います。このコミット以前は、GOROOT
をシステムワイドに設定するためにユーザーのプロファイルファイルを変更していました。
技術的詳細
このコミットの技術的な核心は、GoツールチェインがGOROOT_FINAL
の概念を導入し、GOROOT
環境変数への外部依存を排除した点にあります。
以前のGoのビルドプロセスでは、Goツール(go
コマンド、コンパイラなど)は実行時にGOROOT
環境変数を参照して、Goの標準ライブラリやその他の必要なファイルを見つけていました。そのため、Goをインストールした後、ユーザーは手動で、またはインストーラーが自動的に、GOROOT
をシェルプロファイルファイルに設定する必要がありました。
GOROOT_FINAL
が導入されたことで、Goのビルド時に、Goツールが最終的にインストールされるパス(例: /usr/local/go
)が、Goのバイナリ自体に埋め込まれるようになりました。これにより、Goツールは起動時に自身のバイナリ内部に埋め込まれたパスを直接参照するため、外部のGOROOT
環境変数が設定されているかどうかに関わらず、必要なリソースを正確に特定できるようになります。
この変更により、macOSインストーラーは以下の変更を加えました。
misc/osx/etc/profile_go
の削除: このファイルは、シェルタイプに応じてGOROOT
を設定するためのスクリプトを生成していました。GOROOT
の設定が不要になったため、このファイルは完全に削除されました。misc/osx/package.bash
の変更:- ビルドプロセス中に
GOROOT
とGOROOT_FINAL
を明示的に設定するようになりました。GOROOT
はビルド時の一時的なパスを指し、GOROOT_FINAL
は最終的なインストールパスを指します。これにより、ビルドシステムがGOROOT_FINAL
の値をGoツールに埋め込むことができます。 - 一時ディレクトリの管理方法が若干変更され、より簡潔になりました。
- Goソースのコピー先が、一時的な
GOROOT
パスを使用するように変更されました。
- ビルドプロセス中に
misc/osx/scripts/postinstall
の変更:- インストール後に
/etc/csh.login
,/etc/zshenv
,/etc/profile
といったシステムワイドなシェルプロファイルファイルにGOROOT
を設定する行が削除されました。これにより、インストーラーがユーザーのシステム設定に介入することがなくなりました。
- インストール後に
結果として、Goのインストールはより「自己完結型」になり、ユーザーはGoをインストールした後にGOROOT
を設定する手間が省け、システム環境がよりクリーンに保たれるようになりました。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下の3つのファイルにわたります。
-
misc/osx/etc/profile_go
:- このファイルは完全に削除されました。
- 変更前は、シェルタイプ(cshまたはその他)に応じて
GOROOT
環境変数を設定するecho
コマンドを含んでいました。
--- a/misc/osx/etc/profile_go +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Copyright 2011 The Go Authors. All rights reserved. -# Use of this source code is governed by a BSD-style -# license that can be found in the LICENSE file. - -# The output of this script will be eval'd by the user's shell on startup. This -# script decides what type of shell is being used in the same way as -# /usr/libexec/path_helper - -if echo $SHELL | grep csh$ > /dev/null; then - echo 'setenv GOROOT /usr/local/go' -else - echo 'export GOROOT=/usr/local/go' -fi -
-
misc/osx/package.bash
:GOROOT
とGOROOT_FINAL
の環境変数が明示的に設定されるようになりました。- 一時ディレクトリの作成とGoソースのコピーに関するパスの指定方法が変更されました。
- Goのビルドディレクトリへの移動方法が
pushd
とpopd
を使ってより堅牢になりました。
--- a/misc/osx/package.bash +++ b/misc/osx/package.bash @@ -13,34 +13,32 @@ fi BUILD=/tmp/go.build.tmp ROOT=`hg root` +export GOROOT=$BUILD/root/usr/local/go +export GOROOT_FINAL=/usr/local/go echo "Removing old images" rm -f *.pkg *.dmg echo "Preparing temporary directory" -rm -rf ${BUILD} -mkdir -p ${BUILD} -\n-echo "Preparing template" -mkdir -p ${BUILD}/root/usr/local/\n+rm -rf $BUILD +mkdir -p $BUILD echo "Copying go source distribution" -cp -r $ROOT ${BUILD}/root/usr/local/go -cp -r etc ${BUILD}/root/etc +mkdir -p $BUILD/root/usr/local +cp -r $ROOT $GOROOT +cp -r etc $BUILD/root/etc echo "Building go" -pushd . > /dev/null -cd ${BUILD}/root/usr/local/go -GOROOT=`pwd` +pushd $GOROOT > /dev/null src/version.bash -save rm -rf .hg .hgignore .hgtags cd src ./all.bash | sed "s/^/ /\"\n-cd .. +cd .. popd > /dev/null echo "Building package" -${PM} -v -r ${BUILD}/root -o "Go `hg id`.pkg" \\\n+# $PM came from utils.bahs +$PM -v -r $BUILD/root -o "Go `hg id`.pkg" \\\ --scripts scripts \\\ --id com.googlecode.go \\\ --title Go \\\ @@ -48,4 +46,4 @@ ${PM} -v -r ${BUILD}/root -o "Go `hg id`.pkg" \\\ --target "10.5"\n \n echo "Removing temporary directory"\n-rm -rf ${BUILD}\n+rm -rf $BUILD
-
misc/osx/scripts/postinstall
:- システムワイドなシェルプロファイルファイルに
GOROOT
を設定する行が削除されました。
--- a/misc/osx/scripts/postinstall +++ b/misc/osx/scripts/postinstall @@ -9,11 +9,6 @@ find bin -exec chmod ugo+rx \\{\\} \\;\n find . -type d -exec chmod ugo+rx \\{\\} \\;\n chmod o-w .\n \n-echo "Setting GOROOT system-wide"\n-echo "eval \`/etc/profile_go\`" >> /etc/csh.login\n-echo "eval \`/etc/profile_go\`" >> /etc/zshenv\n-echo "eval \`/etc/profile_go\`" >> /etc/profile\n-\n echo "Fixing debuggers via sudo.bash"\n # setgrp procmod the debuggers (sudo.bash)\n cd $GOROOT/src
- システムワイドなシェルプロファイルファイルに
コアとなるコードの解説
-
misc/osx/etc/profile_go
の削除: このファイルは、Goのインストール後にユーザーのシェル環境にGOROOT
を設定するためのヘルパースクリプトでした。GOROOT_FINAL
の導入により、Goツール自体が自身のルートパスを知るようになったため、外部からGOROOT
を設定する必要がなくなりました。そのため、このファイルは完全に不要となり削除されました。これは、Goのインストールがより「環境に優しい」ものになったことを象徴しています。 -
misc/osx/package.bash
の変更: このスクリプトはmacOSインストーラーパッケージをビルドする役割を担っています。export GOROOT=$BUILD/root/usr/local/go
とexport GOROOT_FINAL=/usr/local/go
の追加は、ビルドプロセス中にGoツールが最終的にどこにインストールされるかを明示的に指定するためのものです。GOROOT_FINAL
の値がGoバイナリに埋め込まれることで、インストール後のGOROOT
環境変数への依存がなくなります。- 一時ディレクトリの管理(
rm -rf $BUILD
とmkdir -p $BUILD
)がより簡潔になり、cp -r $ROOT $GOROOT
のように、新しく定義されたGOROOT
変数を使ってソースコードのコピー先を指定するようになりました。これは、ビルドスクリプト内でのパス管理の一貫性を高めています。 pushd $GOROOT
とpopd
の使用は、ディレクトリの移動と元のディレクトリへの復帰をより安全かつ確実に実行するためのシェルスクリプトの一般的なプラクティスです。
-
misc/osx/scripts/postinstall
の変更: このスクリプトは、GoパッケージがmacOSシステムにインストールされた後に実行されます。- 削除された行は、
eval \
/etc/profile_go`というコマンドを
/etc/csh.login,
/etc/zshenv,
/etc/profileといったシステムワイドなシェルプロファイルファイルに追記していました。これにより、システム上のすべてのユーザーに対してGoの
GOROOT`が自動的に設定されるようになっていました。 - これらの行が削除されたことで、Goインストーラーはユーザーのシェル環境設定に一切変更を加えないようになりました。これは、ユーザーのシステムに対するインストーラーの侵襲性を大幅に減らし、よりクリーンなインストール体験を提供します。ユーザーは必要に応じて手動で
PATH
に$GOROOT/bin
を追加するだけでよくなり、GOROOT
自体を設定する必要はなくなりました。
- 削除された行は、
これらの変更は、Goのビルドシステムとインストールプロセスが成熟し、より洗練されたものになったことを示しています。
関連リンク
- Go issue 2866: misc/osx: don't set GOROOT or modify profile files (このコミットに関連する可能性のあるGoのIssueトラッカーのエントリ)
- Go Change-list 5576064 (コミットメッセージに記載されているGoのコードレビューシステムへのリンク)
参考にした情報源リンク
- Go言語の環境変数 GOROOT と GOPATH について (一般的なGOROOTとGOPATHの解説)
- Goのインストールと環境設定 (Go公式のインストールガイド。現在のGoのインストール方法と比較することで、過去の変更の意義が理解できる)
- シェルスクリプトにおけるpushdとpopd (pushd/popdコマンドの一般的な説明)
- Unix系OSのシェルプロファイルファイルに関する情報 (Bashの起動ファイルに関する詳細)