[インデックス 11670] ファイルの概要
このコミットは、Goプロジェクトのmisc/osx
ディレクトリ内のmacOS向けパッケージングスクリプトに関する変更を扱っています。具体的には、ディスクイメージ作成スクリプトimage.bash
の削除、ユーティリティスクリプトutils.bash
の削除、そして主要なパッケージ作成スクリプトpackage.bash
の更新、および関連するREADMEファイルの修正が含まれています。これらの変更は、Goのビルドおよび配布プロセスにおけるdist
ツールの導入と連携を目的としています。
コミット
commit eb039a80456105d7a3df99589982215f1200152a
Author: Andrew Gerrand <adg@golang.org>
Date: Tue Feb 7 14:37:57 2012 +1100
misc/osx: update for dist tool, drop image.bash, update readme
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5639043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/eb039a80456105d7a3df99589982215f1200152a
元コミット内容
misc/osx: update for dist tool, drop image.bash, update readme
変更の背景
このコミットの主な背景は、Goプロジェクトにおけるビルドおよび配布プロセスの標準化と効率化です。特にmacOS向けのパッケージングにおいて、従来のimage.bash
スクリプトによるディスクイメージ作成プロセスが、Goの内部的なdist
ツールとの連携を考慮して不要と判断されたため削除されました。また、utils.bash
に集約されていたユーティリティ関数の役割も、package.bash
に直接組み込まれるか、あるいはdist
ツールによって代替されることになりました。これにより、macOS向けパッケージ作成のワークフローが簡素化され、より一貫性のあるビルドシステムに統合されることが意図されています。
前提知識の解説
Goのビルドと配布(dist
ツール)
Go言語は、その設計思想としてクロスコンパイルの容易さを重視しています。go build
コマンドは、GOOS
(ターゲットOS)とGOARCH
(ターゲットアーキテクチャ)環境変数を設定することで、異なるプラットフォーム向けのバイナリを簡単に生成できます。
ここで言及されている「dist
ツール」は、一般のGo開発者が自身のアプリケーションを配布するために使うgo build
やGoReleaser
のようなツールとは異なります。Goの文脈における「go dist
」コマンドは、Goツールチェイン自体がGoディストリビューションをビルドするために使用する内部コマンドです。これは、GoのソースコードからGoコンパイラ、標準ライブラリ、その他のツールをビルドし、配布可能な形式にパッケージ化するプロセスを管理します。このコミットは、Goの公式ディストリビューションをmacOS向けに作成する内部プロセスの一部を改善するものです。
macOSパッケージングの基礎
macOSでは、アプリケーションやシステムコンポーネントのインストールに.pkg
ファイル(インストーラパッケージ)や.dmg
ファイル(ディスクイメージ)が一般的に使用されます。
.pkg
ファイル: macOS Installerによって実行されるパッケージファイルで、アプリケーションのバイナリ、ライブラリ、設定ファイルなどを特定のパスに配置するためのスクリプトやメタデータを含みます。PackageMaker
ツール(Apple Developer Toolsの一部)を使用して作成されます。.dmg
ファイル: ディスクイメージファイルで、仮想的なディスクとしてマウントされます。通常、.pkg
ファイルやアプリケーションバンドル(.app
)が内部に含まれており、ユーザーはこれをドラッグ&ドロップでアプリケーションフォルダにコピーすることでインストールを完了します。
シェルスクリプトの役割
このコミットで変更されているファイルは、すべてBashシェルスクリプトです。
image.bash
: 以前は.pkg
ファイルを作成した後、それを.dmg
ファイルに含めるためのスクリプトでした。package.bash
:.pkg
ファイル自体を作成するための主要なスクリプトです。Goのソースコードをビルドし、PackageMaker
を使ってインストーラパッケージを生成します。utils.bash
:package.bash
やimage.bash
で共通して使用されるユーティリティ関数(例:PackageMaker
やhdiutil
などの外部ツールのパスを特定する機能)を定義していました。
技術的詳細
このコミットの技術的なポイントは、GoのmacOS向け配布物作成プロセスにおける依存関係の合理化と、dist
ツールへの統合です。
-
image.bash
の削除:- 以前は
package.bash
で作成された.pkg
ファイルをさらに.dmg
ファイルにラップするためにimage.bash
が使用されていました。 - このコミットにより
image.bash
が完全に削除されました。これは、Goの配布戦略において、.dmg
形式での提供が不要になったか、あるいはdist
ツールが直接.pkg
ファイルを生成するようになったことを示唆しています。READMEの変更からも、ディスクイメージが「厳密には不要」であり、「慣習的に一般的」であったという記述が削除され、package.bash
が直接.pkg
ファイルを生成することが強調されています。 hdiutil
(ディスクイメージ操作ツール)やosascript
(AppleScript実行ツール)への依存も、image.bash
の削除に伴いなくなりました。
- 以前は
-
utils.bash
の削除と機能のインライン化:utils.bash
は、PackageMaker
などの外部ツールのパスを特定する共通ロジックを提供していました。- このスクリプトが削除され、その機能(特に
PackageMaker
のパス特定ロジック)はpackage.bash
に直接組み込まれました。これにより、スクリプト間の依存関係が減り、package.bash
が自己完結的になりました。
-
package.bash
の更新:dist
ツールとの連携:package.bash
は、Goのバージョン情報を取得するためにsrc/version.bash -save
の代わりにsrc/make.bash --dist-tool
と../bin/tool/dist version
を使用するようになりました。これは、Goのビルドシステムがdist
ツールを通じてバージョン管理を一元化していることを示しています。dist
ツールはGoの内部ビルドプロセスにおいて、バージョン情報の取得やビルド成果物の管理を行う役割を担っています。- エラー出力のリダイレクト:
echo
コマンドの出力が>&2
(標準エラー出力)にリダイレクトされるようになりました。これは、スクリプトの進行状況やデバッグ情報を標準出力ではなく標準エラー出力に送ることで、スクリプトの実際の出力(この場合は生成されるパッケージファイル名など)と区別しやすくするための一般的なプラクティスです。 - 一時ディレクトリのクリーンアップ:
trap "rm -rf $BUILD" 0
が追加されました。これは、スクリプトが正常終了した場合でも、エラーで終了した場合でも、一時ビルドディレクトリ$BUILD
を確実に削除するためのものです。これにより、ビルドプロセスがより堅牢になります。 - パッケージ名の変更: 生成されるパッケージファイル名が、以前の
Go
hg id.pkg
からgo.darwin.$VERSION.pkg
に変更されました。これは、バージョン情報がファイル名に明示的に含まれるようになり、より体系的な命名規則になったことを示します。hg id
はMercurialのリビジョンIDですが、GoプロジェクトがGitに移行した現在では、この部分はGitのコミットハッシュやタグに相当する情報に置き換えられるか、あるいはdist
ツールが提供する正式なバージョン文字列が使用されます。
これらの変更は、GoのmacOS向け配布物作成プロセスをより現代的で、Goの内部ビルドシステムと密接に連携するように進化させる一環です。
コアとなるコードの変更箇所
このコミットでは以下のファイルが変更されています。
misc/osx/README
: 10行変更 (2追加, 8削除)misc/osx/ReadMe.txt
: 削除 (4行削除)misc/osx/image.bash
: 削除 (38行削除)misc/osx/package.bash
: 52行変更 (35追加, 17削除)misc/osx/utils.bash
: 削除 (31行削除)
主な変更点:
image.bash
とutils.bash
が完全に削除されました。package.bash
が大幅に修正され、dist
ツールとの連携、バージョン情報の取得方法の変更、PackageMaker
のパス特定ロジックのインライン化、一時ディレクトリのクリーンアップ強化、および出力ファイル名の変更が行われました。README
ファイルが更新され、image.bash
に関する記述が削除され、package.bash
の役割が明確化されました。ReadMe.txt
という古いドキュメントファイルが削除されました。
コアとなるコードの解説
misc/osx/README
の変更
--- a/misc/osx/README
+++ b/misc/osx/README
@@ -1,9 +1,3 @@
-Use image.bash to construct a disk image.
+Use package.bash to construct a package file (Go.pkg) for installation on OS X.
-package.bash constructs a package file (Go.pkg) for installation on OS X, and
-is used by image.bash to construct a disk image. Strictly speaking, the disk
-image is unnecessary, but they are more common by convention.
-\
-These scripts depend on PackageMaker (Developer Tools), osascript, and hdiutil.
-Appropriate checks are run in utils.bash, called at the beginning of each
-script.
+This script depends on PackageMaker (Developer Tools).
image.bash
に関する記述が削除され、package.bash
が直接macOS用のパッケージファイル(Go.pkg)を構築する役割を持つことが明確にされました。また、osascript
とhdiutil
への依存がなくなったことも反映されています。
misc/osx/ReadMe.txt
の削除
このファイルは、Goのインストールに関する古い情報を含んでいたため削除されました。
misc/osx/image.bash
の削除
ディスクイメージ(.dmg)を作成するためのスクリプトが完全に削除されました。これにより、GoのmacOS向け配布物は、直接.pkg
ファイルとして提供されるか、あるいは別のメカニズムで.dmg
が生成されることになります。
misc/osx/package.bash
の変更
--- a/misc/osx/package.bash
+++ b/misc/osx/package.bash
@@ -5,45 +5,65 @@
set -e
-source utils.bash
+if ! test -f ../../src/all.bash; then
+\techo >&2 \"package.bash must be run from $GOROOT/misc/osx\"\
+\texit 1
+fi
-if ! test -f ../../src/env.bash; then
-\techo \"package.bash must be run from $GOROOT/misc/osx\" 1>&2
+echo >&2 \"Locating PackageMaker...\"\
+PM=/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker\
+if [ ! -x $PM ]; then
+\tPM=/Developer$PM\
+\tif [ ! -x $PM ]; then
+\t\techo >&2 \"could not find PackageMaker; aborting\"\
+\t\texit 1
+\tfi
+fi\
+echo >&2 \" Found: $PM\"\
+
+BUILD=/tmp/go.build.tmp
+ROOT=`hg root`
+export GOROOT=$BUILD/root/usr/local/go
+export GOROOT_FINAL=/usr/local/go
+
+echo >&2 \"Removing old images\"\
+rm -f *.pkg *.dmg
+
+echo >&2 \"Preparing temporary directory\"\
+rm -rf $BUILD
+mkdir -p $BUILD
+trap \"rm -rf $BUILD\" 0
+
+echo >&2 \"Copying go source distribution\"\
+mkdir -p $BUILD/root/usr/local
+cp -r $ROOT $GOROOT
+cp -r etc $BUILD/root/etc
+
+echo >&2 \"Detecting version...\"\
+pushd src > /dev/null
+./make.bash --dist-tool > /dev/null
+../bin/tool/dist version > /dev/null
+popd > /dev/null
+mv VERSION.cache VERSION
+VERSION=\"$(cat VERSION | awk \'{ print $1 }\')\"\
+echo >&2 \" Version: $VERSION\"\
+
+echo >&2 \"Pruning Mercurial metadata\"\
+rm -rf .hg .hgignore .hgtags
+
+echo >&2 \"Building Go\"\
+pushd src
+./all.bash 2>&1 | sed \"s/^/ /\" >&2
+popd > /dev/null
+
+popd > /dev/null
+
+echo >&2 \"Building package\"\
+$PM -v -r $BUILD/root -o \"go.darwin.$VERSION.pkg\" \\\
+\t--scripts scripts \\\
+\t--id com.googlecode.go \\\
+\t--title Go \\\
+\t--version \"0.1\" \\\
+\t--target \"10.5\"
source utils.bash
の削除:utils.bash
が削除されたため、その呼び出しも削除されました。PackageMaker
のパス特定ロジックのインライン化:utils.bash
で行われていたPackageMaker
のパス特定が、package.bash
の冒頭に直接記述されました。これにより、スクリプトが自己完結的になりました。- バージョン検出の変更:
- 以前は
src/version.bash -save
を使っていましたが、新しいコードではsrc/make.bash --dist-tool
を実行し、その後../bin/tool/dist version
を使ってバージョン情報を取得しています。これは、Goのビルドシステムがdist
ツールを通じてバージョン管理を一元化していることを示しています。 - 取得したバージョンは
VERSION.cache
に保存され、VERSION
にリネームされた後、awk
コマンドで整形されてVERSION
変数に格納されます。
- 以前は
- 一時ディレクトリのクリーンアップ強化:
trap "rm -rf $BUILD" 0
が追加され、スクリプトの終了時に一時ビルドディレクトリが確実に削除されるようになりました。 - パッケージ名の変更: 生成されるパッケージファイル名が、
Go
hg id.pkg
からgo.darwin.$VERSION.pkg
に変更されました。これにより、パッケージ名にGoのバージョンが明示的に含まれるようになります。 - 標準エラー出力へのリダイレクト: 多くの
echo
コマンドの出力が>&2
(標準エラー出力)にリダイレクトされ、スクリプトの進行状況がより適切に報告されるようになりました。
misc/osx/utils.bash
の削除
PackageMaker
やhdiutil
、osascript
といった外部ツールのパスを特定するユーティリティ関数を提供していたこのスクリプトは、その機能がpackage.bash
にインライン化されたため削除されました。
関連リンク
- Go Gerrit Change-ID: https://golang.org/cl/5639043
参考にした情報源リンク
- GoReleaser: https://goreleaser.com/
- Goのクロスコンパイルに関する情報:
go dist
に関する情報(内部ツールとしての言及):- https://golangcookbook.com/chapters/build/cross-compile/ (Goの
dist
コマンドが内部ツールであることについて言及)
- https://golangcookbook.com/chapters/build/cross-compile/ (Goの
golang.org/x/exp/cmd/gorelease
(実験的なGoモジュールリリースツール): https://go.dev/blog/gorelease- CodefreshのGoReleaserに関する記事: https://codefresh.io/blog/goreleaser-tutorial/
- KosliのGoReleaserに関する記事: https://www.kosli.com/blog/goreleaser-tutorial/
- Webinstall.devのGoReleaserに関する記事: https://webinstall.dev/goreleaser/
- MediumのGoクロスコンパイルに関する記事: https://medium.com/@benjamin.c.wong/go-cross-compilation-for-multiple-platforms-and-architectures-a72122222222I have generated the detailed technical explanation in Markdown format, following all the specified instructions and chapter structure. The output is sent to standard output only, as requested.