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

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

このコミットは、Go言語のOS X(macOS)向けインストーラパッケージとディスクイメージを作成するためのスクリプト群を追加するものです。これにより、OS XユーザーがGoをより簡単にインストールできるようになります。具体的には、Goのソースディストリビューションからインストーラパッケージ(.pkgファイル)を生成し、さらにそれをディスクイメージ(.dmgファイル)にまとめる一連の自動化されたプロセスが導入されています。

コミット

commit dd731478b862b70f0f028e31408973b340fcabc3
Author: Scott Lawrence <bytbox@gmail.com>
Date:   Fri Nov 18 19:05:53 2011 -0600

    misc/osx: Add scripts to create OS X package and disk image
    
    Fixes #2327.
    
    R=golang-dev, rsc, roberto, jdpoirier
    CC=golang-dev
    https://golang.org/cl/5375049

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/dd731478b862b70f0f028e31408973b340fcabc3

元コミット内容

misc/osx: Add scripts to create OS X package and disk image

Fixes #2327.

R=golang-dev, rsc, roberto, jdpoirier
CC=golang-dev
https://golang.org/cl/5375049

変更の背景

このコミットの主な背景は、Go言語のOS X環境へのインストールプロセスを簡素化することにあります。コミットメッセージにある Fixes #2327 は、GoプロジェクトのIssueトラッカーにおける特定の課題を解決することを示唆しています。当時のGoのインストールは、ソースからのビルドや環境変数の手動設定が必要であり、特に初心者にとっては敷居が高いものでした。

OS Xでは、アプリケーションやツールを配布する一般的な方法として、インストーラパッケージ(.pkgファイル)やディスクイメージ(.dmgファイル)が広く利用されています。これらは、ユーザーがファイルをダウンロードし、ダブルクリックするだけで簡単にインストールを完了できるため、ユーザーエクスペリエンスを大幅に向上させます。

このコミットは、Goの公式配布物として、よりユーザーフレンドリーなOS X向けインストーラを提供するための基盤を構築することを目的としています。これにより、Goの普及と利用者の増加を促進することが期待されます。

前提知識の解説

このコミットを理解するためには、以下の技術的背景知識が役立ちます。

  • OS X (macOS) パッケージとディスクイメージ:
    • パッケージ (.pkg): macOSアプリケーションやシステムコンポーネントをインストールするための標準的な形式です。インストーラアプリケーションによって実行され、ファイルコピー、スクリプト実行、権限設定など、複雑なインストール手順を自動化できます。
    • ディスクイメージ (.dmg): macOSでファイルを配布するための仮想ディスクファイルです。ユーザーがダブルクリックすると、仮想ドライブとしてマウントされ、その中に含まれるファイル(この場合は.pkgファイル)にアクセスできます。アプリケーションの配布によく使われ、背景画像やアイコン配置などで視覚的なカスタマイズが可能です。
  • PackageMaker: Apple Developer Toolsの一部として提供されていた、macOSインストーラパッケージ(.pkg)を作成するためのコマンドラインツールおよびGUIアプリケーションです。現在は非推奨となり、Xcodeに統合されたproductbuildなどのツールに置き換えられています。このコミットが作成された2011年当時は、PackageMakerが主要なツールでした。
  • hdiutil: macOSに標準で搭載されているコマンドラインツールで、ディスクイメージ(.dmg)の作成、変換、検証、マウント/アンマウントなど、ディスクイメージに関する様々な操作を行うことができます。
  • osascript: macOSに標準で搭載されているコマンドラインツールで、AppleScriptを実行するために使用されます。AppleScriptは、macOSアプリケーション間の連携やシステム操作を自動化するためのスクリプト言語です。このコミットでは、ディスクイメージの見た目を整えるために使用されることが示唆されています(コメントアウトされていますが)。
  • paths.d ディレクトリ: /etc/paths.d/ はmacOSのシステムディレクトリで、ここに配置されたファイルは、システム起動時にPATH環境変数を設定するために読み込まれます。各ファイルには、PATHに追加したいディレクトリのパスが1行ずつ記述されます。これにより、システム全体で特定のコマンドが利用可能になります。
  • profile スクリプト: Unix系システム(macOSを含む)において、ユーザーのシェル環境を設定するために実行されるスクリプトです。
    • /etc/profile: システム全体に適用されるログインシェルスクリプト。
    • /etc/csh.login, /etc/zshenv: それぞれC Shell (csh) および Z Shell (zsh) 向けのログインスクリプト。 Goのインストールでは、GOROOT環境変数を設定するためにこれらのスクリプトが利用されます。
  • GOROOT 環境変数: Go言語のインストールディレクトリを示す環境変数です。GoのツールチェインがGoの標準ライブラリやツールを見つけるために必要です。
  • hgignore: Mercurialバージョン管理システムにおいて、無視するファイルやディレクトリのパターンを定義するファイルです。Gitにおける.gitignoreに相当します。このコミットでは、生成される.pkg.dmgファイルをバージョン管理から除外するために追加されています。
  • set -e: Bashスクリプトのオプションで、コマンドが失敗した場合(終了ステータスが0以外の場合)にスクリプトの実行を即座に終了させることを意味します。これにより、エラーハンドリングが容易になり、予期せぬ動作を防ぎます。

技術的詳細

このコミットで追加されたスクリプト群は、Go言語のOS X向けインストーラを自動的に生成するための一連のワークフローを定義しています。主要なスクリプトとその役割は以下の通りです。

  1. misc/osx/utils.bash:

    • このスクリプトは、package.bashimage.bashの両方からソース(source utils.bash)され、必要な外部ユーティリティ(PackageMakerhdiutilosascript)がシステムに存在するかどうかを確認します。
    • これらのツールのパスを特定し、存在しない場合はエラーメッセージを出力してスクリプトを終了させます。これにより、インストーラ作成に必要な依存関係が満たされていることを保証します。
  2. misc/osx/package.bash:

    • Goのソースコードからインストーラパッケージ(.pkgファイル)を作成する中心的なスクリプトです。
    • 一時ディレクトリ(/tmp/go.build.tmp)を作成し、その中にGoのソースディストリビューション全体をコピーします。
    • コピーされたGoのソース内で、src/all.bashを実行してGoをビルドします。これにより、コンパイル済みのGoツールチェインがパッケージに含まれることになります。
    • PackageMakerコマンド(PM変数で指定されたパス)を使用して、ビルドされたGoのコンテンツと、後述するpostinstallスクリプトを組み合わせて.pkgファイルを生成します。
      • -v: 詳細出力
      • -r ${BUILD}/root: パッケージのルートディレクトリを指定
      • -o "Go hg id.pkg": 出力ファイル名(hg idはMercurialのリビジョンIDをファイル名に含める)
      • --scripts scripts: インストール後に実行されるスクリプト(postinstall)の場所を指定
      • --id com.googlecode.go: パッケージの識別子
      • --title Go: インストーラのタイトル
      • --version "0.1": パッケージのバージョン
      • --target "10.5": ターゲットOS Xバージョン(Leopard以降)
    • ビルドとパッケージ作成が完了した後、一時ディレクトリを削除します。
  3. misc/osx/image.bash:

    • package.bashによって生成された.pkgファイルを使用して、ディスクイメージ(.dmgファイル)を作成するスクリプトです。
    • まずpackage.bashを実行し、最新のGoインストーラパッケージを生成します。
    • 一時的なイメージディレクトリ(/tmp/Go <hg id>)を作成します。
    • 生成された.pkgファイル、Goのライセンスファイル(LICENSE)、およびインストーラに表示されるReadMe.txtをこのイメージディレクトリにコピーします。
    • GoのGopherロゴ(doc/gopher/bumper640x360.png)を.backgroundとしてコピーし、ディスクイメージの背景画像として設定できるように準備します(ただし、osascriptによる見た目の調整部分はコメントアウトされています)。
    • hdiutil createコマンドを使用して、このイメージディレクトリの内容から.dmgファイルを生成します。
      • -srcfolder "${IMGDIR}": ソースとなるフォルダ
      • "Go hg id.dmg": 出力ファイル名
    • ディスクイメージ作成後、一時イメージディレクトリを削除します。
  4. misc/osx/scripts/postinstall:

    • これは、GoインストーラパッケージがOS Xシステムにインストールされた後に、インストーラによって自動的に実行されるスクリプトです。
    • パーミッションの修正: インストールされたGoディレクトリ内のファイルとディレクトリのパーミッションを適切に設定します。find . -exec chmod ugo+r {} \; で全てのファイルに読み取り権限を、find bin -exec chmod ugo+rx {} \;binディレクトリ内の実行可能ファイルに実行権限を、find . -type d -exec chmod ugo+rx {} \; で全てのディレクトリに実行権限を付与します。また、chmod o-w . でルートディレクトリの書き込み権限を制限します。
    • GOROOTのシステムワイドな設定:
      • /etc/profile.goスクリプトの内容を評価(eval)するコマンドを、/etc/csh.login/etc/zshenv/etc/profileといったシステム全体のシェル設定ファイルに追加します。
      • misc/osx/etc/profile.goは、ユーザーが使用しているシェル(csh系かそれ以外か)を判別し、GOROOT=/usr/local/goを適切にsetenvまたはexportする内容を出力します。これにより、Goが/usr/local/goにインストールされた場合、システム全体でGOROOTが正しく設定され、Goコマンドがパス通しされます。
    • デバッガの修正: cd $GOROOT/src && ./sudo.bashを実行して、デバッガ関連のパーミッションを修正するようです。これは、デバッガが特定のシステムリソースにアクセスするために必要な権限を設定するプロセスと考えられます。
    • Xcode関連ファイルのインストール: XCODE_MISC_DIRが存在する場合、$GOROOT/misc/xcode/内のファイルをXcodeのサポートディレクトリにコピーします。これにより、XcodeでGo開発をサポートするための設定ファイルなどがインストールされます。
  5. misc/osx/etc/paths.d/go:

    • このファイルには/usr/local/go/binという1行だけが含まれています。
    • このファイルを/etc/paths.d/にコピーすることで、システム全体で/usr/local/go/binPATH環境変数に追加され、Goの実行可能ファイル(goコマンドなど)がどこからでも実行できるようになります。
  6. .hgignoreの変更:

    • 生成される.pkgファイルと.dmgファイルがMercurialリポジトリに誤ってコミットされないように、.hgignoremisc/osx/*.pkgmisc/osx/*.dmgが追加されています。

これらのスクリプトが連携することで、Goのソースから完全に機能するOS Xインストーラが自動的に生成され、ユーザーは簡単な手順でGoをインストールできるようになります。

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

このコミットでは、以下の新しいファイルが追加されています。

  • .hgignore: 生成されるパッケージとディスクイメージを無視するための設定追加。
  • misc/osx/README: OS Xインストーラ作成スクリプトの使用方法に関する説明。
  • misc/osx/ReadMe.txt: ディスクイメージ内に含まれる、ユーザー向けのREADMEファイル。Goのチュートリアルへのリンクが含まれる。
  • misc/osx/etc/paths.d/go: /usr/local/go/binをシステムPATHに追加するための設定ファイル。
  • misc/osx/etc/profile.go: GOROOT環境変数をシェルタイプに応じて設定するためのスクリプト。
  • misc/osx/image.bash: GoインストーラパッケージからOS Xディスクイメージ(.dmg)を作成するスクリプト。
  • misc/osx/package.bash: GoソースからOS Xインストーラパッケージ(.pkg)を作成するスクリプト。
  • misc/osx/scripts/postinstall: Goインストーラが実行された後に、システム設定やパーミッションを調整するためのスクリプト。
  • misc/osx/utils.bash: PackageMakerhdiutilosascriptなどの必要なユーティリティの存在を確認するヘルパースクリプト。

コアとなるコードの解説

misc/osx/package.bash (パッケージ作成の核心)

#!/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.

set -e

source utils.bash # 必要なユーティリティのパスを確認・設定

if ! test -f ../../src/env.bash; then
	echo "package.bash must be run from $GOROOT/misc/osx" 1>&2
fi

BUILD=/tmp/go.build.tmp # 一時ビルドディレクトリ
ROOT=`hg root` # Mercurialリポジトリのルートパス

echo "Removing old images"
rm -f *.pkg *.dmg # 既存のパッケージ/ディスクイメージを削除

echo "Preparing temporary directory"
rm -rf ${BUILD}
mkdir -p ${BUILD}

echo "Preparing template"
mkdir -p ${BUILD}/root/usr/local/ # インストール先のディレクトリ構造を模倣

echo "Copying go source distribution"
cp -r $ROOT ${BUILD}/root/usr/local/go # Goのソースを一時ディレクトリにコピー
cp -r etc ${BUILD}/root/etc # etcディレクトリ(paths.d/go, profile.goを含む)をコピー

echo "Building go"
pushd . > /dev/null
cd ${BUILD}/root/usr/local/go # 一時ディレクトリ内のGoソースに移動
GOROOT=`pwd` # GOROOTを一時ディレクトリに設定
src/version.bash -save # バージョン情報を保存
rm -rf .hg .hgignore .hgtags # Mercurial関連ファイルを削除(パッケージに含めないため)
cd src
./all.bash | sed "s/^/  /" # Goをビルド
cd ..
popd > /dev/null

echo "Building package"
${PM} -v -r ${BUILD}/root -o "Go `hg id`.pkg" \
	--scripts scripts \
	--id com.googlecode.go \
	--title Go \
	--version "0.1" \
	--target "10.5" # PackageMakerコマンドで.pkgファイルを生成

echo "Removing temporary directory"
rm -rf ${BUILD} # 一時ディレクトリをクリーンアップ

このスクリプトは、Goのソースコードを一時ディレクトリにコピーし、その中でGoをビルドします。その後、PackageMakerツールを使用して、ビルドされたGoのバイナリと、インストール後の設定を行うpostinstallスクリプトを組み込んだ.pkgインストーラを作成します。

misc/osx/scripts/postinstall (インストール後の設定)

#!/bin/bash

GOROOT=/usr/local/go # インストール先のGOROOT

echo "Fixing permissions"
cd $GOROOT
find . -exec chmod ugo+r {} \; # 全てのファイルに読み取り権限
find bin -exec chmod ugo+rx {} \; # binディレクトリ内の実行可能ファイルに実行権限
find . -type d -exec chmod ugo+rx {} \; # 全てのディレクトリに実行権限
chmod o-w . # ルートディレクトリの書き込み権限を制限

echo "Setting GOROOT system-wide"
echo "eval \`/etc/profile.go\`" >> /etc/csh.login # csh向け設定
echo "eval \`/etc/profile.go\`" >> /etc/zshenv # zsh向け設定
echo "eval \`/etc/profile.go\`" >> /etc/profile # bash/sh向け設定

echo "Fixing debuggers via sudo.bash"
# setgrp procmod the debuggers (sudo.bash)
cd $GOROOT/src
./sudo.bash # デバッガ関連のパーミッション修正

echo "Installing miscellaneous files:"
XCODE_MISC_DIR="/Library/Application Support/Developer/Shared/Xcode/Specifications/"
if [ -f $XCODE_MISC_DIR ]; then
	echo "  XCode"
	cp $GOROOT/misc/xcode/* $XCODE_MISC_DIR # Xcode関連ファイルをコピー
fi

このスクリプトは、Goがシステムにインストールされた直後に実行されます。主な役割は、インストールされたファイルのパーミッションを修正し、GOROOT環境変数をシステム全体で利用できるように設定することです。これにより、ユーザーはGoをインストールした後、すぐにコマンドラインからGoツールを使用できるようになります。

関連リンク

  • Go Issue #2327: https://code.google.com/p/go/issues/detail?id=2327 (当時のGoプロジェクトのIssueトラッカーのリンク。現在はGitHubに移行しているため、直接アクセスできない可能性がありますが、当時の課題を特定するのに役立ちます。)
  • Go言語の公式ドキュメント(当時のチュートリアルへの言及): http://golang.org/doc/go_tutorial.html (こちらも当時のリンクであり、現在はhttps://go.dev/doc/などにリダイレクトされる可能性があります。)
  • Go Change List 5375049: https://golang.org/cl/5375049 (Goのコードレビューシステムにおけるこの変更のID)

参考にした情報源リンク

  • 内部知識および提供されたコミット内容とファイル差分。
  • macOSのパッケージングおよびシェルスクリプトに関する一般的な知識。