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

[インデックス 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.」という記述から、以下の状況が推測されます。

  1. ツールの名前変更: makerelease ツール、またはその内部で利用される何らかのツールが名前変更された。
  2. パスの不整合: 名前変更により、installer.wxs などのリソースファイルへのパスが正しく解決できなくなった。
  3. Darwinでの先行修正: 同様のパスの問題がmacOS (Darwin) 向けのビルドでも発生しており、そちらは既に修正されていたが、Windows向けは見落とされていた。

このコミットは、Windowsインストーラーのビルドプロセスを修正し、installer.wxs ファイルを GOROOT(Goのインストールディレクトリ)内の標準的な場所から取得するようにすることで、この問題を解決することを目的としています。これにより、ツールの名前変更やリポジトリの構造変更に影響されにくい、より堅牢なパス解決が実現されます。また、カスタムの installer.wxs ファイルを指定するオプションが削除されたことから、リリースビルドにおいては標準のリソースを使用するという方針が明確になったと考えられます。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  1. Go言語のビルドシステムと GOROOT:

    • GOROOT は、Go言語のSDKがインストールされているディレクトリを指す環境変数です。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリに格納されています。
    • Goのビルドプロセスでは、GOROOT を基準として各種リソースやツールが参照されます。
    • runtime.GOROOT() は、Goプログラム内で現在の GOROOT のパスを取得するための関数です。
  2. 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インストーラーのビルドにおいて、インストーラーの主要な定義を含むファイルとして使用されます。
  3. filepath.Join:

    • Go言語の path/filepath パッケージに含まれる関数で、複数のパス要素を結合して単一のパスを生成します。オペレーティングシステムに応じた適切なパス区切り文字(Windowsでは \、Unix系では /)を使用するため、クロスプラットフォームなパス操作に適しています。
  4. Go言語のリリースプロセス:

    • Go言語のプロジェクトでは、misc/makerelease のようなツールが、様々なプラットフォーム向けのバイナリやインストーラーを自動的にビルドし、リリースパッケージを作成するために使用されます。これらのツールは、Goリポジトリ内の特定のパスに配置されたリソースファイル(例: installer.wxs)を参照することがあります。

これらの知識を総合すると、このコミットは、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.rootmakerelease ツールが実行されている環境における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 の処理は削除

この変更のポイントは以下の通りです。

  1. b.root から runtime.GOROOT() への変更:

    • runtime.GOROOT() は、現在実行中のGoプログラムが認識しているGoのインストールルートディレクトリの絶対パスを返します。これは環境変数 GOROOT の値、またはGoがビルド時に埋め込んだデフォルトのパスに基づきます。
    • これにより、installer.wxs の参照元が、Goリポジトリの特定の相対パスから、Go SDKがインストールされている標準的な場所へと変更されました。これは、Goのツールやリソースが通常 GOROOT 以下に配置されるというGoのエコシステムの慣習に沿ったものです。
    • この変更により、makerelease ツールがどこから実行されても、GOROOT が正しく設定されていれば、installer.wxs ファイルを確実に特定できるようになります。これは、ビルドの堅牢性と移植性を向上させます。
  2. 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点が変更されています。

  1. var ブロックから wxsFile フラグの定義が削除されました。
    -	wxsFile         = flag.String("wxs", "", "path to custom installer.wxs")
    
  2. 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の標準的な環境設定に依存するようになりました。

関連リンク

参考にした情報源リンク