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

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

このコミットは、Go言語のディストリビューションツール (misc/dist/bindist.go) に、Windows向けMSIインストーラーの作成時に使用するカスタムの installer.wxs ファイルを指定するための -wxs フラグを追加するものです。これにより、Goの公式ディストリビューションプロセスにおいて、インストーラーのカスタマイズ性が向上します。

コミット

commit bfdc45a456d5931e670f299ab7b4f68ecf570bff
Author: Andrew Gerrand <adg@golang.org>
Date:   Mon Mar 26 17:32:20 2012 +1100

    misc/dist: add -wxs flag to provide custom installer.wxs file
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/5908055

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

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

元コミット内容

misc/dist: add -wxs flag to provide custom installer.wxs file

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5908055

変更の背景

Go言語のディストリビューションプロセスでは、Windowsユーザー向けにMSIインストーラーが提供されています。このインストーラーは、WiX Toolsetというツールキットを使用して installer.wxs というXMLファイルから生成されます。

従来のプロセスでは、misc/dist/windows/installer.wxs という固定のパスにあるファイルがインストーラー生成に使用されていました。しかし、Goのディストリビューションをビルドする際に、特定の要件やカスタマイズされた設定を持つインストーラーを作成したい場合、この固定パスでは柔軟性がありませんでした。

このコミットは、bindist.go ツールに -wxs という新しいコマンドラインフラグを追加することで、ユーザーが任意のパスにある installer.wxs ファイルを指定できるようにし、インストーラー生成プロセスのカスタマイズ性を向上させることを目的としています。これにより、Goの公式ビルドプロセスや、サードパーティによるGoディストリビューションのビルドにおいて、より多様なインストーラー要件に対応できるようになります。

前提知識の解説

MSIインストーラー

MSI (Microsoft Software Installer) は、Microsoft Windowsオペレーティングシステムで使用されるインストールパッケージの形式です。.msi 拡張子を持つファイルで、ソフトウェアのインストール、メンテナンス、削除に関する情報を含んでいます。Windows Installerサービスによって処理され、ソフトウェアの展開と管理を標準化します。

WiX Toolset (Windows Installer XML Toolset)

WiX Toolsetは、Windows Installer (MSI) パッケージをXMLソースコードからビルドするためのオープンソースのツールセットです。開発者は、インストーラーの構造、ファイル、レジストリエントリ、ショートカットなどをXML形式で記述し、WiX Toolsetのコンパイラ (candle.exe) とリンカー (light.exe) を使用してMSIファイルを生成します。

WXSファイル

WXS (WiX Source) ファイルは、WiX Toolsetで使用されるXML形式のソースファイルです。このファイルには、MSIインストーラーのすべての定義が含まれています。例えば、インストールされるファイル、ディレクトリ構造、レジストリ設定、ユーザーインターフェースの要素などが記述されます。ProductPackageDirectoryComponentFileFeature などの要素が主要な構成要素となります。

Go言語の flag パッケージ

Go言語の標準ライブラリには、コマンドライン引数を解析するための flag パッケージが含まれています。このパッケージを使用すると、プログラムの起動時にユーザーが指定できるオプション(フラグ)を簡単に定義できます。例えば、flag.String 関数は文字列型のフラグを定義し、その値を変数にバインドします。

技術的詳細

このコミットの技術的詳細の核心は、Go言語のディストリビューションビルドスクリプトである misc/dist/bindist.go に、新しいコマンドラインフラグ -wxs を追加し、そのフラグの値に基づいてMSIインストーラーのWXSソースファイルのパスを動的に変更する点にあります。

  1. フラグの定義: bindist.govar ブロック内に、wxsFile という新しいグローバル変数が flag.String を使って定義されています。

    var (
        // ... 既存のフラグ定義 ...
        wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
        // ...
    )
    
    • "wxs": コマンドラインで指定するフラグ名です。例えば、go run bindist.go -wxs /path/to/my_installer.wxs のように使用されます。
    • "": wxsFile フラグのデフォルト値です。何も指定されない場合は空文字列になります。
    • "path to custom installer.wxs": このフラグの簡単な説明です。
  2. WXSファイルパスの動的な設定: Build 構造体の Do メソッド内で、Windows向けMSIインストーラーを作成するロジックの箇所に、追加されたフラグの値をチェックする条件分岐が導入されています。

    func (b *Build) Do() error {
        // ... 既存のロジック ...
        // Create MSI installer.
        win := filepath.Join(b.root, "misc/dist/windows")
        installer := filepath.Join(win, "installer.wxs")
        if *wxsFile != "" {
            installer = *wxsFile
        }
        // ... MSIインストーラー生成の残りのロジック ...
    }
    
    • まず、デフォルトの installer.wxs のパス (misc/dist/windows/installer.wxs) が installer 変数に設定されます。
    • 次に、if *wxsFile != "" という条件で、ユーザーが -wxs フラグに値を指定したかどうかをチェックします。*wxsFile は、flag.String で定義されたポインタから実際の文字列値を取得しています。
    • もし wxsFile フラグが空文字列でなければ(つまり、ユーザーがカスタムパスを指定した場合)、installer 変数の値はユーザーが指定したパス (*wxsFile) で上書きされます。
    • これにより、その後のMSIインストーラー生成プロセスでは、この installer 変数に格納されたパスのWXSファイルが使用されることになります。

この変更により、Goのディストリビューションビルド時に、標準の installer.wxs ではなく、特定の要件に合わせたカスタムのWXSファイルを使用してインストーラーを生成することが可能になります。これは、例えば、特定の企業環境向けのGoインストーラーにカスタムのライセンス条項を含めたり、特定のディレクトリ構造にインストールさせたりする際に非常に有用です。

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

diff --git a/misc/dist/bindist.go b/misc/dist/bindist.go
index b03fd706db..115049aa68 100644
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -33,6 +33,7 @@ var (
 	repo    = flag.String("repo", "https://code.google.com/p/go", "repo URL")
 	verbose = flag.Bool("v", false, "verbose output")
 	upload  = flag.Bool("upload", true, "upload resulting files to Google Code")
+	wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
 
 	username, password string // for Google Code upload
 )
@@ -248,6 +249,9 @@ func (b *Build) Do() error {
 		// Create MSI installer.
 		win := filepath.Join(b.root, "misc/dist/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.

コアとなるコードの解説

上記の差分は、misc/dist/bindist.go ファイルに対する2つの主要な変更を示しています。

  1. 新しいフラグの追加:

    +	wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
    

    この行は、Goの flag パッケージを使用して、wxsFile という名前の新しいコマンドラインフラグを定義しています。

    • "wxs": コマンドラインでこのオプションを指定する際に使用する名前です。
    • "": このフラグのデフォルト値です。ユーザーが -wxs オプションを指定しない場合、wxsFile の値は空文字列になります。
    • "path to custom installer.wxs": このフラグが何をするのかを説明する短いヘルプメッセージです。 この定義により、bindist.go を実行する際に -wxs <path> の形式でカスタムWXSファイルのパスを渡せるようになります。
  2. WXSファイルパスの条件付き上書き:

    +		if *wxsFile != "" {
    +			installer = *wxsFile
    +		}
    

    このコードブロックは、MSIインストーラーを生成する部分に挿入されています。

    • installer := filepath.Join(win, "installer.wxs"): まず、installer 変数には、GoディストリビューションのデフォルトのWXSファイルパス(misc/dist/windows/installer.wxs)が設定されます。
    • if *wxsFile != "": ここで、新しく定義された wxsFile フラグにユーザーが何らかの値を指定したかどうかをチェックします。*wxsFile は、flag.String が返すポインタの参照外しを行い、フラグの実際の文字列値を取得しています。
    • installer = *wxsFile: もし wxsFile フラグが空でなければ(つまり、カスタムパスが指定された場合)、installer 変数の値は、ユーザーが -wxs フラグで指定したパスに上書きされます。

この変更により、bindist.go は、デフォルトのWXSファイルを使用するか、ユーザーが指定したカスタムWXSファイルを使用するかを動的に決定できるようになり、GoのWindowsインストーラービルドプロセスの柔軟性が大幅に向上します。

関連リンク

参考にした情報源リンク