[インデックス 13293] ファイルの概要
このコミットは、Go言語のビルドスクリプト(src/all.bash
とsrc/all.bat
)におけるPATH
環境変数の扱いに関する修正です。具体的には、dist banner
コマンドを実行する前にPATH
環境変数を元の状態に戻すことで、ビルドプロセスの安定性と予測可能性を向上させています。
コミット
commit 81368d9bb9cc503df33d470785edc816a9086cd3
Author: Shenghou Ma <minux.ma@gmail.com>
Date: Wed Jun 6 20:19:16 2012 +0800
build: restore PATH before "dist banner"
Fixes #3699.
R=golang-dev, r, rsc
CC=golang-dev
https://golang.org/cl/6272048
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/81368d9bb9cc503df33d470785edc816a9086cd3
元コミット内容
build: restore PATH before "dist banner"
Fixes #3699.
変更の背景
このコミットは、Go言語のIssue #3699を修正するために行われました。Issue #3699は、GoのビルドプロセスにおいてPATH
環境変数が変更されたままになり、その後のdist banner
コマンドの実行に影響を与える可能性があった問題を指摘しています。
Goのビルドシステムは、make.bash
やmake.bat
といったスクリプトを使用して、Goツールチェイン自体をビルドします。このビルドプロセス中に、一時的にPATH
環境変数が変更されることがあります。例えば、ビルドされたばかりのGoツール(go
コマンドなど)が一時的なパスに追加され、その後のビルドステップで利用できるようにするためです。
しかし、dist banner
コマンドは、ビルドが完了した後にビルド情報を表示するために実行されるものであり、このコマンドが実行される際には、ビルドプロセス中に変更されたPATH
環境変数の影響を受けないことが望ましいです。もしPATH
が変更されたままだと、dist banner
が予期せぬバージョンのツールを参照したり、環境に依存する問題を引き起こしたりする可能性がありました。
このコミットは、dist banner
を実行する直前にPATH
を元の状態に戻すことで、このような潜在的な問題を回避し、ビルドプロセスの堅牢性を高めることを目的としています。
前提知識の解説
PATH
環境変数: オペレーティングシステムが実行可能ファイル(コマンド)を探す際に参照するディレクトリのリストです。例えば、go
コマンドを実行する際に、システムはこのPATH
に設定されたディレクトリの中からgo
という名前の実行ファイルを探します。- Go言語のビルドシステム: Go言語自体をソースコードからビルドするための仕組みです。通常、
GOROOT/src
ディレクトリにあるall.bash
(Linux/macOS)やall.bat
(Windows)といったスクリプトを実行することで、Goコンパイラ、標準ライブラリ、各種ツールなどがビルドされます。 dist banner
コマンド: Goツールチェインの一部であるgo tool dist
コマンドのサブコマンドの一つです。これは、現在のGoのバージョン、ビルド情報、環境に関する詳細を表示するために使用されます。ビルドの健全性を確認したり、デバッグ情報として利用されたりします。Fixes #<issue_number>
: Gitのコミットメッセージにおける慣習の一つで、特定のイシュートラッカー(この場合はGitHub Issues)のイシューを修正したことを示します。これにより、コミットとイシューが関連付けられ、イシューが自動的にクローズされることがあります。all.bash
/all.bat
: Go言語のソースコードからGoツールチェイン全体をビルドするためのトップレベルのスクリプトです。それぞれBashシェルスクリプトとWindowsバッチファイルです。make.bash
/make.bat
:all.bash
/all.bat
から呼び出されるスクリプトで、Goのコンパイラや標準ライブラリなどの主要なコンポーネントをビルドします。
技術的詳細
このコミットの技術的な核心は、PATH
環境変数の保存と復元です。
-
PATH
の保存:src/all.bash
では、OLDPATH="$PATH"
という行が追加され、現在のPATH
環境変数の値がOLDPATH
という新しいシェル変数に保存されます。src/all.bat
では、set OLDPATH=%PATH%
という行が追加され、現在のPATH
環境変数の値がOLDPATH
という新しい環境変数に保存されます。
-
ビルドプロセスの実行:
./make.bash --no-banner
(Linux/macOS) またはcall make.bat --no-banner --no-local
(Windows) が実行されます。これらのスクリプトはGoツールチェインのビルドを行い、この過程で一時的にPATH
が変更される可能性があります。bash run.bash --no-rebuild
(Linux/macOS) またはcall run.bat --no-rebuild --no-local
(Windows) が実行されます。これもビルドプロセスの一部です。
-
PATH
の復元:src/all.bash
では、PATH="$OLDPATH"
という行が追加され、OLDPATH
に保存されていた元のPATH
の値が現在のPATH
環境変数に上書きされます。src/all.bat
では、set PATH=%OLDPATH%
という行が追加され、OLDPATH
に保存されていた元のPATH
の値が現在のPATH
環境変数に上書きされます。
-
dist banner
の実行:$GOTOOLDIR/dist banner
(Linux/macOS) またはgo tool dist banner
(Windows) が実行されます。この時点でPATH
はビルド開始前の状態に戻っているため、dist banner
はクリーンな環境で実行され、予期せぬ依存関係の問題を回避できます。
このアプローチにより、ビルドプロセス中にPATH
がどのように変更されても、dist banner
コマンドは常に安定した、予測可能な環境で実行されることが保証されます。これは、ビルドの再現性と信頼性を高める上で重要な修正です。
コアとなるコードの変更箇所
src/all.bash
--- a/src/all.bash
+++ b/src/all.bash
@@ -8,6 +8,8 @@ if [ ! -f make.bash ]; then
echo 'all.bash must be run from $GOROOT/src' 1>&2
exit 1
fi
+OLDPATH="$PATH"
. ./make.bash --no-banner
bash run.bash --no-rebuild
+PATH="$OLDPATH"
$GOTOOLDIR/dist banner # print build info
src/all.bat
--- a/src/all.bat
+++ b/src/all.bat
@@ -11,10 +11,12 @@ echo all.bat must be run from go\src
goto end
:ok
+set OLDPATH=%PATH%
call make.bat --no-banner --no-local
if %GOBUILDFAIL%==1 goto end
call run.bat --no-rebuild --no-local
if %GOBUILDFAIL%==1 goto end
+set PATH=%OLDPATH%
go tool dist banner
:end
コアとなるコードの解説
-
src/all.bash
:OLDPATH="$PATH"
:make.bash
やrun.bash
が実行される前に、現在のPATH
環境変数の値をOLDPATH
というシェル変数に保存しています。PATH="$OLDPATH"
:make.bash
とrun.bash
の実行後、dist banner
コマンドが実行される直前に、保存しておいたOLDPATH
の値をPATH
環境変数に戻しています。これにより、dist banner
はビルドプロセスによるPATH
の変更の影響を受けずに実行されます。
-
src/all.bat
:set OLDPATH=%PATH%
:make.bat
やrun.bat
が実行される前に、現在のPATH
環境変数の値をOLDPATH
という環境変数に保存しています。Windowsのバッチファイルでは、set
コマンドを使って環境変数を設定します。set PATH=%OLDPATH%
:make.bat
とrun.bat
の実行後、go tool dist banner
コマンドが実行される直前に、保存しておいたOLDPATH
の値をPATH
環境変数に戻しています。これもall.bash
と同様に、dist banner
がクリーンな環境で実行されることを保証します。
これらの変更は、ビルドスクリプトの堅牢性を高め、環境依存のビルド問題を減らすための重要な改善です。
関連リンク
- Go Issue #3699: https://github.com/golang/go/issues/3699
- Go Change-list 6272048: https://golang.org/cl/6272048
参考にした情報源リンク
- Go言語のソースコード(特に
src/all.bash
とsrc/all.bat
の歴史的な変更履歴) - Gitのコミットと差分表示の一般的な理解
- 環境変数
PATH
に関する一般的な知識 - Go言語のビルドプロセスに関する一般的な知識
- GitHub Issuesの利用方法に関する一般的な知識
go tool dist
コマンドに関する一般的な知識 (Goの公式ドキュメントやgo help dist
コマンドから得られる情報)- BashスクリプトとWindowsバッチファイルの基本的な構文と環境変数操作