Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11906] ファイルの概要

このコミットは、Go言語のビルドシステムにおける sudo.bash スクリプトの修正に関するものです。具体的には、go tool dist env コマンドを使用して環境変数を正しく設定し、GOTOOLDIR を利用することで、ビルドされたツール(profcov)のコピー元パスをより堅牢にする変更が行われています。これにより、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のビルド環境をより動的に、かつ堅牢に利用するように変更された点にあります。

  1. eval $(go tool dist env) の追加: 以前のスクリプトでは、Goのビルド環境に関する情報が明示的にロードされていませんでした。この変更により、スクリプトの冒頭で eval $(go tool dist env) が実行されます。これにより、go tool dist env が出力する GOTOOLDIR などの環境変数が現在のシェルセッションに設定されます。これは、Goのビルドシステムが管理するツールのパスを正確に取得するために不可欠です。

  2. ../bin/tool/$i から $GOTOOLDIR/$i へのパス変更: 最も重要な変更点です。以前は、profcov といったツールをコピーする際に、スクリプトの実行場所からの相対パス ../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: 変更前の行です。ここでは、profcov といったツールを /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のビルドシステムが提供する標準的な環境変数を利用することで、ハードコードされた相対パスの依存性を排除し、より柔軟で安定したビルド・インストールプロセスを実現しています。

関連リンク

参考にした情報源リンク