[インデックス 15479] ファイルの概要
このコミットは、Go言語プロジェクトのmisc/osxディレクトリから、macOS向けのレガシーなパッケージングスクリプトを削除するものです。これらのスクリプトは、misc/distにある新しいツールによって置き換えられました。
コミット
commit 76e4a033523bb6ca661e1905f0381e2603c109d4
Author: Andrew Gerrand <adg@golang.org>
Date: Thu Feb 28 10:39:09 2013 +1100
misc/osx: remove legacy packaging scripts
These are superseded by the tool at misc/dist.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/7420044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/76e4a033523bb6ca661e1905f0381e2603c109d4
元コミット内容
このコミットは、以下の4つのファイルを削除しています。
misc/osx/README:package.bashの使用方法と、それがPackageMakerに依存していることを説明するファイル。misc/osx/etc/paths.d/go:/usr/local/go/binをPATHに追加するための設定ファイル。misc/osx/package.bash: macOS用のGoインストーラパッケージ(Go.pkg)を構築するためのBashスクリプト。PackageMakerツールを使用しています。misc/osx/scripts/postinstall: インストール後に実行されるスクリプトで、Goのインストールディレクトリのパーミッション修正、デバッガのパーミッション設定(sudo.bashを使用)、Xcode関連ファイルのインストールなどを行っていました。
これらのファイルは合計で96行のコードを削除しています。
変更の背景
この変更の背景には、Go言語の配布(distribution)プロセスにおける改善と標準化があります。以前は、OS X(現在のmacOS)向けのインストーラパッケージを生成するために、misc/osxディレクトリに独自のBashスクリプト(package.bash)が存在していました。このスクリプトはAppleのDeveloper Toolsに含まれるPackageMakerというツールに依存しており、Goのソースコードのコピー、ビルド、そして最終的なパッケージの作成を行っていました。
しかし、このようなプラットフォーム固有のパッケージングスクリプトは、メンテナンスが煩雑になりがちです。Goプロジェクトは、より汎用的で統一された配布ツールを開発し、異なるプラットフォーム(Windows, Linux, macOSなど)向けのバイナリ配布物を生成するプロセスを効率化しようとしました。その結果として開発されたのがmisc/distツールです。
このコミットは、misc/distツールが十分に成熟し、従来のOS X向けパッケージングスクリプトの機能を完全に代替できるようになったため、レガシーなスクリプトを削除し、コードベースを整理することを目的としています。これにより、Goの配布プロセスの管理が簡素化され、将来的なメンテナンスコストが削減されます。
前提知識の解説
このコミットを理解するためには、以下の知識が役立ちます。
- Go言語のビルドと配布: Go言語は、ソースコードから直接バイナリをビルドできる特徴を持っています。公式のGoディストリビューションは、様々なOSやアーキテクチャ向けにコンパイルされたバイナリパッケージとして提供されます。
- macOSのパッケージング: macOSでは、アプリケーションやシステムファイルをインストールするために
.pkg形式のインストーラパッケージがよく使用されます。これらは、特定のディレクトリにファイルを配置し、インストール後にスクリプトを実行するなどの機能を持っています。 - PackageMaker: Appleが提供していた開発者ツールの一部で、macOS向けのインストーラパッケージ(
.pkgファイル)を作成するためのGUIアプリケーションおよびコマンドラインツールです。macOS 10.7 Lion以降は非推奨となり、macOS 10.9 Mavericksで削除されました。後継としてproductbuildやpkgbuildなどのコマンドラインツールが提供されています。 - Bashスクリプト: Unix系OSで広く使われるシェルスクリプト言語です。ファイル操作、コマンド実行、環境変数の設定など、自動化されたタスクによく用いられます。
GOROOTとGOROOT_FINAL: Go言語の環境変数です。GOROOT: Goのインストールディレクトリ(SDKのルート)を指します。Goのツールチェイン(コンパイラ、リンカなど)や標準ライブラリがここに配置されます。GOROOT_FINAL:package.bashスクリプト内で使用されていた変数で、最終的なインストール先パス(/usr/local/go)を示していました。これは、パッケージ作成時にビルド環境とインストール環境のパスを区別するために使われます。
misc/dist: Go言語プロジェクト内のディレクトリで、Goの公式配布バイナリを生成するためのツール群が格納されています。これは、クロスプラットフォーム対応のビルドとパッケージングを自動化するための、より現代的なアプローチを提供します。sudo.bash: Goのソースツリー内に存在するスクリプトで、デバッガ(例えばgdb)が特定のシステム権限(procmodグループへの設定など)を必要とする場合に、それらの権限を適切に設定するために使用されることがあります。これはセキュリティ上の理由から、通常はsudoコマンドを介して実行されます。
技術的詳細
このコミットは、Go言語の配布戦略における重要な移行を示しています。
削除されたpackage.bashスクリプトは、以下のような手順でGoのインストーラパッケージを作成していました。
- PackageMakerの検出: スクリプトはまず、システムにPackageMakerツールがインストールされているかを確認します。これは、
/Applications/Utilities/PackageMaker.appまたは/Developer/Applications/Utilities/PackageMaker.appのパスを探索することで行われます。 - 一時ディレクトリの準備: ビルドプロセスで使用する一時ディレクトリ(
/tmp/go.build.tmp)を作成し、クリーンアップのためのトラップを設定します。 - Goソースのコピーと環境設定: Goのソースツリー全体を一時ディレクトリ内の
$BUILD/root/usr/local/goにコピーします。この際、GOROOT環境変数を一時的なビルドパスに設定し、GOROOT_FINALを最終的なインストールパス(/usr/local/go)に設定します。これは、ビルド時に参照されるパスと、最終的にユーザーのシステムにインストールされるパスを区別するためです。 - バージョン検出: Goのソースツリー内で
./make.bash --dist-toolを実行し、../bin/tool/dist versionを使ってGoのバージョン情報を取得します。これは、生成されるパッケージファイル名にバージョンを含めるためです。 - Mercurialメタデータの削除: コピーされたGoソースツリーから、Mercurial(Goが以前使用していたバージョン管理システム)のメタデータファイル(
.hg,.hgignore,.hgtags)を削除します。これは、最終的なパッケージのサイズを削減し、不要なファイルを含めないためです。 - Goのビルド: コピーされたソースツリー内で
./all.bashを実行し、Goのツールチェインと標準ライブラリをビルドします。 - パッケージの構築: 最後に、PackageMakerコマンド(
$PM)を呼び出し、一時ディレクトリ内のビルド済みGoツリーを元に、go.darwin.$VERSION.pkgという名前のインストーラパッケージを生成します。この際、--scripts scriptsオプションでpostinstallスクリプトを指定し、--id、--title、--version、--targetなどのメタデータを設定します。
削除されたpostinstallスクリプトは、パッケージインストール後に以下の処理を実行していました。
- パーミッションの修正: インストールされたGoディレクトリ内のファイルとディレクトリのパーミッションを適切に設定します。具体的には、すべてのファイルに読み取り権限(
ugo+r)を与え、binディレクトリ内の実行ファイルには実行権限(ugo+rx)を与え、すべてのディレクトリにも実行権限(ugo+rx)を与えます。また、ルートディレクトリの書き込み権限を制限(o-w)します。 - デバッガのパーミッション修正:
sudo.bashスクリプトを実行して、デバッガ(例:gdb)が正しく動作するために必要なパーミッション(例えば、procmodグループへの設定)を設定します。これは、デバッガが他のプロセスのメモリを検査するために特別な権限を必要とするためです。 - Xcode関連ファイルのインストール: Xcodeの特定のディレクトリ(
/Library/Application Support/Developer/Shared/Xcode/Specifications/)が存在する場合、$GOROOT/misc/xcode/内のファイルをコピーします。これは、XcodeがGoのプロジェクトを認識したり、Goのコードをハイライト表示したりするための設定ファイルである可能性があります。
これらのスクリプトは、GoのmacOS向け配布物を手動で構築する際の複雑な手順を自動化していましたが、misc/distツールへの移行により、その役割を終えました。misc/distは、より抽象化された方法でビルドとパッケージングを管理し、プラットフォーム固有の詳細を内部で処理することで、配布プロセスの全体的な効率と信頼性を向上させています。
コアとなるコードの変更箇所
このコミットは、既存のコードを削除するのみで、新しいコードの追加や既存コードの変更はありません。
misc/osx/README: ファイル全体が削除されました。misc/osx/etc/paths.d/go: ファイル全体が削除されました。misc/osx/package.bash: ファイル全体が削除されました。misc/osx/scripts/postinstall: ファイル全体が削除されました。
コアとなるコードの解説
削除されたファイルは、GoのmacOS向けインストーラパッケージを生成するための具体的な実装でした。
package.bashは、GoのソースからmacOSインストーラをビルドする「レシピ」のようなものでした。これには、Goのビルドプロセス、PackageMakerツールの呼び出し、一時ファイルの管理など、多くの手順が含まれていました。postinstallは、インストール後にシステムレベルの調整を行うためのスクリプトでした。特に、デバッガの権限設定は、macOSのセキュリティモデルと深く関連しており、Go開発者がデバッグ環境をセットアップする上で重要なステップでした。
これらのスクリプトが削除されたことは、Goの配布プロセスが、より高レベルで抽象化されたmisc/distツールに完全に移行したことを意味します。開発者は、もはやこれらの低レベルなパッケージングの詳細を気にする必要がなくなり、misc/distツールを通じて統一された方法で配布物を生成できるようになりました。これは、Goプロジェクトの成熟と、ビルド・配布インフラストラクチャの改善を示すものです。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Go言語のソースコードリポジトリ(GitHub): https://github.com/golang/go
- Go言語のGerritコードレビューシステム: https://go.googlesource.com/go/+/refs/heads/master/CONTRIBUTING.md#the-code-review-process (Gerrit CLへのリンクはここから辿れます)
参考にした情報源リンク
- PackageMaker (Apple Developer Documentation - Deprecated): https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/PackageMakerUserGuide/PackageMakerUserGuide.html (アーカイブされたドキュメント)
pkgbuildandproductbuildman pages (macOS Terminal):man pkgbuild,man productbuild- Go言語の
misc/distディレクトリの現在の内容 (GitHub): https://github.com/golang/go/tree/master/misc/dist - Go言語の環境変数に関するドキュメント: https://golang.org/doc/install#environment
- Goの
sudo.bashに関する議論や情報(Stack Overflowなど): https://stackoverflow.com/questions/tagged/go+sudo.bash (一般的な情報源として) - Goのコミット履歴(Gerrit): https://go.googlesource.com/go/+/7420044 (元のGerrit CL)