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

[インデックス 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)を内部に埋め込むことができるようになりました。

この変更の背景には、以下の点が挙げられます。

  1. インストールプロセスの簡素化とクリーンアップ: ユーザーのシェルプロファイルファイル(例: .bashrc, .zshrc, /etc/profileなど)を自動的に変更することは、予期せぬ副作用を引き起こしたり、ユーザーが自身の環境設定を管理する上で混乱を招いたりする可能性がありました。GOROOTの設定が不要になることで、インストーラーはこれらのファイルを変更する必要がなくなり、よりクリーンなインストールが可能になります。
  2. 環境変数の依存関係の削減: ツールが自身の依存するパスを内部的に持つことで、外部の環境変数に依存する度合いが減り、システムのセットアップがより堅牢になります。ユーザーが誤ってGOROOTを設定し忘れたり、間違った値を設定したりしても、Goツールは正しく動作するようになります。
  3. 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.bashpostinstallスクリプト: 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インストーラーは以下の変更を加えました。

  1. misc/osx/etc/profile_goの削除: このファイルは、シェルタイプに応じてGOROOTを設定するためのスクリプトを生成していました。GOROOTの設定が不要になったため、このファイルは完全に削除されました。
  2. misc/osx/package.bashの変更:
    • ビルドプロセス中にGOROOTGOROOT_FINALを明示的に設定するようになりました。GOROOTはビルド時の一時的なパスを指し、GOROOT_FINALは最終的なインストールパスを指します。これにより、ビルドシステムがGOROOT_FINALの値をGoツールに埋め込むことができます。
    • 一時ディレクトリの管理方法が若干変更され、より簡潔になりました。
    • Goソースのコピー先が、一時的なGOROOTパスを使用するように変更されました。
  3. misc/osx/scripts/postinstallの変更:
    • インストール後に/etc/csh.login, /etc/zshenv, /etc/profileといったシステムワイドなシェルプロファイルファイルにGOROOTを設定する行が削除されました。これにより、インストーラーがユーザーのシステム設定に介入することがなくなりました。

結果として、Goのインストールはより「自己完結型」になり、ユーザーはGoをインストールした後にGOROOTを設定する手間が省け、システム環境がよりクリーンに保たれるようになりました。

コアとなるコードの変更箇所

このコミットにおける主要なコード変更は以下の3つのファイルにわたります。

  1. 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
    -
    
  2. misc/osx/package.bash:

    • GOROOTGOROOT_FINALの環境変数が明示的に設定されるようになりました。
    • 一時ディレクトリの作成とGoソースのコピーに関するパスの指定方法が変更されました。
    • Goのビルドディレクトリへの移動方法がpushdpopdを使ってより堅牢になりました。
    --- 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
    
  3. 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/goexport GOROOT_FINAL=/usr/local/go の追加は、ビルドプロセス中にGoツールが最終的にどこにインストールされるかを明示的に指定するためのものです。GOROOT_FINALの値がGoバイナリに埋め込まれることで、インストール後のGOROOT環境変数への依存がなくなります。
    • 一時ディレクトリの管理(rm -rf $BUILDmkdir -p $BUILD)がより簡潔になり、cp -r $ROOT $GOROOTのように、新しく定義されたGOROOT変数を使ってソースコードのコピー先を指定するようになりました。これは、ビルドスクリプト内でのパス管理の一貫性を高めています。
    • pushd $GOROOTpopdの使用は、ディレクトリの移動と元のディレクトリへの復帰をより安全かつ確実に実行するためのシェルスクリプトの一般的なプラクティスです。
  • 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のビルドシステムとインストールプロセスが成熟し、より洗練されたものになったことを示しています。

関連リンク

参考にした情報源リンク