[インデックス 18708] ファイルの概要
このコミットは、Go言語のリリース作成ツールである misc/makerelease
におけるWindowsインストーラーのリソースパスの修正に関するものです。具体的には、インストーラーのビルド時に使用される installer.wxs
ファイルの参照元を、ビルド環境の GOROOT
から取得するように変更し、カスタム installer.wxs
ファイルのパスを指定するオプションを削除しています。
コミット
commit 9d1940bc7423bf95def174a595bb014b3daa33ac
Author: Andrew Gerrand <adg@golang.org>
Date: Mon Mar 3 12:50:29 2014 +1100
misc/makerelease: use windows installer resources from local goroot
This broke when we renamed the tool, and I missed this fix when I
fixed darwin last week.
LGTM=minux.ma, bradfitz
R=golang-codereviews, minux.ma, bradfitz
CC=golang-codereviews
https://golang.org/cl/70670043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/9d1940bc7423bf95bb014b3daa33ac
元コミット内容
misc/makerelease: use windows installer resources from local goroot
このコミットは、misc/makerelease
ツールがWindowsインストーラーのリソースをローカルの GOROOT
から使用するように変更します。コミットメッセージによると、これはツールの名前変更時に発生したバグであり、以前のDarwin向けの修正時に見落とされていたとのことです。
変更の背景
この変更の背景には、Go言語のリリースプロセスにおけるWindowsインストーラーのビルド方法の変更と、それに伴うツールの名前変更があります。
Go言語のリリースでは、Windowsユーザー向けにMSI(Microsoft Installer)形式のインストーラーが提供されます。このインストーラーは、WiX Toolset(Windows Installer XML Toolset)というツールを使用してビルドされます。WiX Toolsetは、XML形式のソースファイル(.wxs
ファイル)をコンパイルしてMSIパッケージを生成します。installer.wxs
は、インストーラーの構造、インストールされるファイル、レジストリ設定などを定義する主要なXMLファイルです。
以前は、misc/makerelease
ツールが installer.wxs
ファイルを特定の相対パス(b.root
、おそらくGoリポジトリのルートディレクトリ)から参照していました。しかし、ツールの名前変更(おそらく makerelease
ツール自体、またはその依存ツール)が行われた際に、この相対パスの参照が壊れてしまいました。
コミットメッセージにある「This broke when we renamed the tool, and I missed this fix when I fixed darwin last week.」という記述から、以下の状況が推測されます。
- ツールの名前変更:
makerelease
ツール、またはその内部で利用される何らかのツールが名前変更された。 - パスの不整合: 名前変更により、
installer.wxs
などのリソースファイルへのパスが正しく解決できなくなった。 - Darwinでの先行修正: 同様のパスの問題がmacOS (Darwin) 向けのビルドでも発生しており、そちらは既に修正されていたが、Windows向けは見落とされていた。
このコミットは、Windowsインストーラーのビルドプロセスを修正し、installer.wxs
ファイルを GOROOT
(Goのインストールディレクトリ)内の標準的な場所から取得するようにすることで、この問題を解決することを目的としています。これにより、ツールの名前変更やリポジトリの構造変更に影響されにくい、より堅牢なパス解決が実現されます。また、カスタムの installer.wxs
ファイルを指定するオプションが削除されたことから、リリースビルドにおいては標準のリソースを使用するという方針が明確になったと考えられます。
前提知識の解説
このコミットを理解するためには、以下の前提知識が必要です。
-
Go言語のビルドシステムと
GOROOT
:GOROOT
は、Go言語のSDKがインストールされているディレクトリを指す環境変数です。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリに格納されています。- Goのビルドプロセスでは、
GOROOT
を基準として各種リソースやツールが参照されます。 runtime.GOROOT()
は、Goプログラム内で現在のGOROOT
のパスを取得するための関数です。
-
WiX ToolsetとMSIインストーラー:
- WiX Toolset: Windows Installer XML Toolsetの略で、Microsoft Windows Installer (MSI) パッケージを作成するためのオープンソースのツールセットです。XML形式でインストーラーの動作を定義し、それをコンパイルしてMSIファイル(Windowsのソフトウェアインストーラーパッケージ)を生成します。
- MSIファイル: Windowsオペレーティングシステムで使用されるインストールパッケージの形式です。ソフトウェアのインストール、更新、削除を管理します。
.wxs
ファイル: WiX Toolsetのソースファイルで、XML形式で記述されます。インストーラーのコンポーネント、ファイル、レジストリキー、ショートカット、カスタムアクションなどを定義します。installer.wxs
は、GoのWindowsインストーラーのビルドにおいて、インストーラーの主要な定義を含むファイルとして使用されます。
-
filepath.Join
:- Go言語の
path/filepath
パッケージに含まれる関数で、複数のパス要素を結合して単一のパスを生成します。オペレーティングシステムに応じた適切なパス区切り文字(Windowsでは\
、Unix系では/
)を使用するため、クロスプラットフォームなパス操作に適しています。
- Go言語の
-
Go言語のリリースプロセス:
- Go言語のプロジェクトでは、
misc/makerelease
のようなツールが、様々なプラットフォーム向けのバイナリやインストーラーを自動的にビルドし、リリースパッケージを作成するために使用されます。これらのツールは、Goリポジトリ内の特定のパスに配置されたリソースファイル(例:installer.wxs
)を参照することがあります。
- Go言語のプロジェクトでは、
これらの知識を総合すると、このコミットは、GoのWindowsインストーラーをビルドする際に、installer.wxs
ファイルの場所を GOROOT
内の固定パスに変更することで、ツールの名前変更によって生じたパス解決の問題を解決し、リリースビルドの堅牢性を高めていると理解できます。
技術的詳細
このコミットの技術的な核心は、Windowsインストーラーのビルドプロセスにおける installer.wxs
ファイルのパス解決方法の変更にあります。
変更前は、installer.wxs
ファイルのパスは以下のように構築されていました。
// 変更前
win := filepath.Join(b.root, "misc/makerelease/windows")
installer := filepath.Join(win, "installer.wxs")
if *wxsFile != "" {
installer = *wxsFile
}
ここで、b.root
は makerelease
ツールが実行されている環境におけるGoリポジトリのルートディレクトリを指していると推測されます。つまり、installer.wxs
はGoリポジトリ内の misc/makerelease/windows
ディレクトリに存在することを前提としていました。また、wxsFile
というフラグが存在し、ユーザーがカスタムの installer.wxs
ファイルのパスを指定できる柔軟性がありました。
しかし、ツールの名前変更や、Goリポジトリの構造変更、あるいはビルド環境のセットアップ方法の変化により、b.root
を基準とした相対パスが正しく機能しなくなったと考えられます。特に、リリースビルドのような自動化された環境では、b.root
が常に期待通りの場所を指すとは限りません。
この問題を解決するため、コミットは installer.wxs
のパス解決を以下のように変更しました。
// 変更後
win := filepath.Join(runtime.GOROOT(), "misc/makerelease/windows")
installer := filepath.Join(win, "installer.wxs")
// *wxsFile の処理は削除
この変更のポイントは以下の通りです。
-
b.root
からruntime.GOROOT()
への変更:runtime.GOROOT()
は、現在実行中のGoプログラムが認識しているGoのインストールルートディレクトリの絶対パスを返します。これは環境変数GOROOT
の値、またはGoがビルド時に埋め込んだデフォルトのパスに基づきます。- これにより、
installer.wxs
の参照元が、Goリポジトリの特定の相対パスから、Go SDKがインストールされている標準的な場所へと変更されました。これは、Goのツールやリソースが通常GOROOT
以下に配置されるというGoのエコシステムの慣習に沿ったものです。 - この変更により、
makerelease
ツールがどこから実行されても、GOROOT
が正しく設定されていれば、installer.wxs
ファイルを確実に特定できるようになります。これは、ビルドの堅牢性と移植性を向上させます。
-
wxsFile
フラグの削除:wxsFile
フラグとその関連ロジックが完全に削除されました。これは、リリースビルドにおいてはカスタムのinstaller.wxs
ファイルを使用するのではなく、GOROOT
内に存在する標準のリソースを使用するという方針転換を示唆しています。- これにより、リリースプロセスの複雑性が軽減され、一貫性が保たれます。カスタムの
wxs
ファイルが必要な場合は、別の方法(例: ビルドスクリプトでファイルをコピーするなど)で対応する必要があるかもしれません。
この変更は、Goのリリースビルドシステムが、特定の開発環境の相対パスに依存するのではなく、Goの標準的なインストールパス(GOROOT
)に依存するように移行したことを示しています。これにより、ビルドの信頼性が向上し、将来的なツールの変更やリポジトリ構造の変更に対する耐性が高まります。
コアとなるコードの変更箇所
変更は misc/makerelease/makerelease.go
ファイルの func (b *Build) Do() error
メソッド内で行われています。
--- a/misc/makerelease/makerelease.go
+++ b/misc/makerelease/makerelease.go
@@ -36,7 +36,6 @@ var (
repo = flag.String("repo", "https://code.google.com/p/go", "repo URL")
verbose = flag.Bool("v", false, "verbose output")
upload = flag.Bool("upload", false, "upload resulting files to Google Code")
- wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
addLabel = flag.String("label", "", "additional label to apply to file when uploading")
includeRace = flag.Bool("race", true, "build race detector packages")
versionOverride = flag.String("version", "", "override version name")
@@ -399,11 +398,8 @@ func (b *Build) Do() error {
targs = append(targs, targ)
// Create MSI installer.
- win := filepath.Join(b.root, "misc/makerelease/windows")
+ win := filepath.Join(runtime.GOROOT(), "misc/makerelease/windows")
installer := filepath.Join(win, "installer.wxs")
- if *wxsFile != "" {
- installer = *wxsFile
- }
appfiles := filepath.Join(work, "AppFiles.wxs")
msi := filepath.Join(work, "installer.msi")
// Gather files.
具体的には、以下の2点が変更されています。
var
ブロックからwxsFile
フラグの定義が削除されました。- wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
- MSIインストーラーを作成する部分で、
win
変数の初期化がb.root
からruntime.GOROOT()
に変更され、それに伴いwxsFile
フラグを使用する条件分岐が削除されました。- win := filepath.Join(b.root, "misc/makerelease/windows") + win := filepath.Join(runtime.GOROOT(), "misc/makerelease/windows") installer := filepath.Join(win, "installer.wxs") - if *wxsFile != "" { - installer = *wxsFile - }
コアとなるコードの解説
このコミットのコアとなるコードの変更は、Go言語のWindowsインストーラーをビルドする際の installer.wxs
ファイルの探索ロジックを修正しています。
変更前は、makerelease
ツールは b.root
という変数(これはGoリポジトリのルートディレクトリを指すと考えられます)を基準として、misc/makerelease/windows
ディレクトリ内の installer.wxs
を探していました。このアプローチは、makerelease
ツールがGoリポジトリの特定の構造内で実行されることを前提としていました。しかし、ツールの名前変更やビルド環境の変更により、この相対パスが期待通りに解決できなくなる問題が発生しました。
また、wxsFile
というコマンドラインフラグが存在し、ユーザーが明示的にカスタムの installer.wxs
ファイルのパスを指定できる機能がありました。これは開発やデバッグの際には便利ですが、公式リリースビルドのような自動化されたプロセスでは、標準のリソースを使用することが一般的です。
変更後、win
変数の初期化は filepath.Join(runtime.GOROOT(), "misc/makerelease/windows")
となりました。
runtime.GOROOT()
は、現在実行中のGoプログラムが認識しているGoのインストールディレクトリの絶対パスを返します。これにより、installer.wxs
ファイルは、Go SDKがインストールされている場所($GOROOT/misc/makerelease/windows/installer.wxs
)から確実に参照されるようになります。- この変更は、
makerelease
ツールがGoリポジトリのどこに配置されていても、あるいはGo SDKがどこにインストールされていても、標準的なGOROOT
のパスを介して必要なリソースを見つけられるようにすることで、ビルドプロセスの堅牢性を大幅に向上させます。 wxsFile
フラグとその関連ロジックが削除されたことで、カスタムのinstaller.wxs
を指定する機能がなくなりました。これは、Goの公式リリースビルドにおいては、常に標準のリソースを使用するという方針を強化するものです。これにより、ビルドの複雑性が減り、一貫性が保たれます。
この修正により、GoのWindowsインストーラーのビルドプロセスは、より安定し、Goの標準的な環境設定に依存するようになりました。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Go言語のソースコードリポジトリ (GitHub): https://github.com/golang/go
- WiX Toolset 公式サイト: https://wixtoolset.org/
- Go言語の
runtime
パッケージドキュメント: https://pkg.go.dev/runtime - Go言語の
path/filepath
パッケージドキュメント: https://pkg.go.dev/path/filepath
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- Go言語のコードレビューシステム (Gerrit): https://go-review.googlesource.com/ (コミットメッセージに記載されている
https://golang.org/cl/70670043
はGerritの変更リストへのリンクです) - WiX Toolset Documentation: https://wixtoolset.org/documentation/
- Go言語の環境変数
GOROOT
に関する情報 (Go公式ドキュメントなど) filepath.Join
およびruntime.GOROOT()
のGo言語標準ライブラリドキュメント