[インデックス 11906] ファイルの概要
このコミットは、Go言語のビルドシステムにおける sudo.bash
スクリプトの修正に関するものです。具体的には、go tool dist env
コマンドを使用して環境変数を正しく設定し、GOTOOLDIR
を利用することで、ビルドされたツール(prof
と cov
)のコピー元パスをより堅牢にする変更が行われています。これにより、Goツールのインストールプロセスが改善され、将来的なパスの変更にも対応できるようになります。
コミット
commit 95902d10d2de03b1c22c626462627fb2251cf55b
Author: David Symonds <dsymonds@golang.org>
Date: Wed Feb 15 08:42:16 2012 +1100
build: fix sudo.bash.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5647063
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/95902d10d2de03b1c22c626462627fb2251cf55b
元コミット内容
build: fix sudo.bash.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5647063
変更の背景
このコミットの背景には、Go言語のビルドプロセスにおけるツールのインストール方法の改善があります。以前の sudo.bash
スクリプトでは、prof
(プロファイラ) や cov
(カバレッジツール) といったビルド済みツールを /usr/local/bin
にコピーする際に、相対パス ../bin/tool/$i
を使用していました。この相対パスは、スクリプトが実行される環境やGoのソースツリーの構造変更によって、壊れる可能性がありました。
この問題を解決し、より堅牢で将来にわたって安定したパス解決を実現するために、Goのビルドシステムが提供する公式の環境変数 GOTOOLDIR
を利用するように変更されました。GOTOOLDIR
は、Goツールがインストールされているディレクトリを指すため、相対パスの代わりにこれを使用することで、スクリプトの信頼性が向上します。
前提知識の解説
このコミットを理解するためには、以下の概念について知っておく必要があります。
sudo.bash
: Unix/Linuxシステムで特権ユーザー(root)としてコマンドを実行するためのsudo
コマンドを利用するシェルスクリプトです。Go言語のビルドシステムにおいて、ビルドされたツールをシステム全体で利用可能なパス(例:/usr/local/bin
)にインストールするために使用されます。go tool dist env
: Go言語のビルドシステムが提供する内部コマンドの一つです。このコマンドは、Goのビルド環境に関する環境変数(例:GOROOT
,GOTOOLDIR
など)をシェルスクリプトでeval
できる形式で出力します。これにより、スクリプト内でGoのビルド環境に依存するパスや設定を動的に取得できます。eval $(command)
: シェルスクリプトの構文で、command
の実行結果を現在のシェルでコマンドとして評価(実行)します。このコミットではeval $(go tool dist env)
を使用することで、go tool dist env
が出力する環境変数の設定を現在のシェルセッションに適用しています。GOTOOLDIR
: Go言語のビルドシステムによって設定される環境変数で、Goの標準ツール(コンパイラ、リンカ、プロファイラなど)が格納されているディレクトリのパスを指します。この変数は、Goのビルドプロセスにおいて重要な役割を果たし、ツールの場所を動的に解決するために使用されます。chgrp
: Unix/Linuxコマンドで、ファイルのグループ所有者を変更します。このコミットではprocmod
グループに変更しています。chmod g+s
: Unix/Linuxコマンドで、ファイルのパーミッションを変更します。g+s
は、SetGIDビットを設定します。これにより、そのファイルを実行する際に、ファイルのグループIDで実行されるようになります。これは、特定の権限でツールを実行する必要がある場合に利用されます。
技術的詳細
このコミットの技術的な核心は、sudo.bash
スクリプトがGoのビルド環境をより動的に、かつ堅牢に利用するように変更された点にあります。
-
eval $(go tool dist env)
の追加: 以前のスクリプトでは、Goのビルド環境に関する情報が明示的にロードされていませんでした。この変更により、スクリプトの冒頭でeval $(go tool dist env)
が実行されます。これにより、go tool dist env
が出力するGOTOOLDIR
などの環境変数が現在のシェルセッションに設定されます。これは、Goのビルドシステムが管理するツールのパスを正確に取得するために不可欠です。 -
../bin/tool/$i
から$GOTOOLDIR/$i
へのパス変更: 最も重要な変更点です。以前は、prof
やcov
といったツールをコピーする際に、スクリプトの実行場所からの相対パス../bin/tool/$i
を使用していました。この相対パスは、Goのソースツリーのレイアウト変更や、スクリプトが異なる場所から実行された場合に問題を引き起こす可能性がありました。 新しいコードでは、eval $(go tool dist env)
によって設定されたGOTOOLDIR
環境変数を利用し、$GOTOOLDIR/$i
という絶対パスに近い形でツールの場所を指定しています。GOTOOLDIR
はGoのビルドシステムによって管理されるため、Goのバージョンアップやソースツリーの再配置があっても、常に正しいツールの場所を指すことが保証されます。これにより、ツールのインストールプロセスがより信頼性の高いものになりました。
この変更は、Goのビルドシステムが提供する公式のメカニズムを利用することで、スクリプトの保守性と堅牢性を向上させる典型的な例と言えます。
コアとなるコードの変更箇所
--- a/src/sudo.bash
+++ b/src/sudo.bash
@@ -17,13 +17,14 @@ if [[ ! -d /usr/local/bin ]]; then
exit 2
fi
+eval $(go tool dist env)
cd $(dirname $0)
for i in prof cov
do
# Remove old binaries if present
sudo rm -f /usr/local/bin/6$i
# Install new binaries
-\tsudo cp ../bin/tool/$i /usr/local/bin/go$i
+\tsudo cp $GOTOOLDIR/$i /usr/local/bin/go$i
sudo chgrp procmod /usr/local/bin/go$i
sudo chmod g+s /usr/local/bin/go$i
done
コアとなるコードの解説
-
+eval $(go tool dist env)
: この行が追加されたことで、sudo.bash
スクリプトが実行されるシェル環境に、Goのビルドシステムが定義する環境変数(特にGOTOOLDIR
)がロードされます。go tool dist env
は、export VAR=value
の形式で環境変数の設定を出力するため、eval
コマンドによってそれらが現在のシェルで実行され、環境変数が設定されます。これにより、スクリプトの以降の処理でGOTOOLDIR
を参照できるようになります。 -
-\tsudo cp ../bin/tool/$i /usr/local/bin/go$i
: 変更前の行です。ここでは、prof
やcov
といったツールを/usr/local/bin
にコピーする際に、スクリプトの実行ディレクトリからの相対パス../bin/tool/$i
を使用していました。このパスは、スクリプトの実行コンテキストに依存し、Goのソースツリーの構造変更に弱いという問題がありました。 -
+\tsudo cp $GOTOOLDIR/$i /usr/local/bin/go$i
: 変更後の行です。eval $(go tool dist env)
によって設定されたGOTOOLDIR
環境変数を利用しています。$GOTOOLDIR
はGoのビルドシステムが管理するツールのルートディレクトリを指すため、$GOTOOLDIR/$i
は常に正しいツールのバイナリへのパスを提供します。これにより、ツールのコピー元パスが動的かつ堅牢になり、スクリプトの信頼性が大幅に向上しました。
この変更は、Goのビルドシステムが提供する標準的な環境変数を利用することで、ハードコードされた相対パスの依存性を排除し、より柔軟で安定したビルド・インストールプロセスを実現しています。
関連リンク
- Go CL 5647063: https://golang.org/cl/5647063
参考にした情報源リンク
- Go言語の公式ドキュメント (go tool dist env, GOTOOLDIRに関する情報):
- Unix/Linux シェルスクリプトに関する情報 (eval, chgrp, chmod g+s):
- Go言語のビルドシステムに関する一般的な情報: