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

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

このコミットは、Go言語のWindows向けインストーラーの作成方法を、従来のInno Setupベースの実行可能ファイル(EXE)形式から、WiX Toolsetを用いたMicrosoft Installer(MSI)形式へと移行するものです。これにより、Windows環境でのGoの配布と管理が改善されます。

コミット

commit e4eacf39e9db9357fa4823c9c8c230e444ab6170
Author: Joe Poirier <jdpoirier@gmail.com>
Date:   Wed Nov 9 17:20:34 2011 -0600

    misc/windows: Go for Windows installer in MSI format
    
    Requesting suggestions for the comment and description strings in installer.wxs.
    Fixes #2394.
    
    R=rsc, alex.brainman, tjyang2001
    CC=golang-dev
    https://golang.org/cl/5339046
---
 misc/windows/README        |  7 ++--
 misc/windows/installer.iss | 98 ----------------------------------------------
 misc/windows/installer.wxs | 80 +++++++++++++++++++++++++++++++++++++
 misc/windows/package.bash  | 26 +++++++-----\n 4 files changed, 101 insertions(+), 110 deletions(-)

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

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

元コミット内容

misc/windows: Go for Windows installer in MSI format

Requesting suggestions for the comment and description strings in installer.wxs.
Fixes #2394.

R=rsc, alex.brainman, tjyang2001
CC=golang-dev
https://golang.org/cl/5339046

変更の背景

このコミットの主な背景は、Go言語のWindows向けインストーラーを、より標準的で管理しやすいMSI(Microsoft Installer)形式に移行することです。元のコミットメッセージにある Fixes #2394 は、この変更がIssue 2394を解決することを示しています。Issue 2394は「WindowsインストーラーをMSI形式にする」という要望であったと推測されます。

EXE形式のインストーラー(Inno Setupなどで作成されるもの)は、単純なインストールには適していますが、企業環境でのソフトウェア展開や、パッチ適用、アンインストール時の整合性維持といった面で、MSI形式に劣ります。MSIはWindows Installerサービスによって管理されるため、より堅牢なインストール、修復、アンインストール機能を提供し、グループポリシーなどを用いた集中管理が可能です。

この変更は、Go言語のWindowsユーザーベースの拡大と、よりプロフェッショナルな配布メカニズムへのニーズに応えるためのものです。

前提知識の解説

Inno Setup

Inno Setupは、Windowsアプリケーション用のフリーなインストーラー作成ツールです。Pascalスクリプトに似た独自のスクリプト言語(.issファイル)を使用して、インストーラーの動作やUIを定義します。シンプルで使いやすく、小規模なプロジェクトや個人開発者によく利用されます。出力は通常、単一の実行可能ファイル(EXE)形式のインストーラーです。

WiX Toolset (Windows Installer XML Toolset)

WiX Toolsetは、Microsoftが開発した、Windows Installer(MSI)パッケージを作成するためのオープンソースツールセットです。XMLファイル(.wxsファイル)を使用して、インストールのロジック、ファイル、レジストリ設定、ショートカットなどを宣言的に記述します。WiXは、MSIの複雑な構造をXMLで抽象化し、開発者がより簡単にMSIパッケージを作成できるようにします。

WiX Toolsetは、主に以下のコンポーネントで構成されます。

  • candle.exe: XMLソースファイル(.wxs)をコンパイルして、オブジェクトファイル(.wixobj)を生成します。
  • light.exe: オブジェクトファイル(.wixobj)をリンクして、最終的なMSIパッケージを生成します。
  • heat.exe: 既存のファイルやディレクトリ構造をスキャンし、それらを記述するWiX XMLフラグメントを自動生成するツールです。これにより、手動で大量のファイルエントリを記述する手間を省くことができます。

MSI (Microsoft Installer)

MSIは、Microsoft Windowsオペレーティングシステムで使用されるインストールパッケージの形式です。Windows Installerサービスによって管理され、ソフトウェアのインストール、メンテナンス、削除を標準化された方法で処理します。MSIパッケージは、データベース形式で構成されており、インストールされるファイル、レジストリキー、ショートカット、カスタムアクションなどの情報を含んでいます。

MSIの主な利点は以下の通りです。

  • トランザクション性: インストールプロセス全体がトランザクションとして扱われ、途中で失敗した場合でもシステムを元の状態に戻すことができます。
  • ロールバック機能: インストールが失敗した場合、システムを以前の状態に自動的に戻します。
  • 修復機能: アプリケーションのファイルが破損したり削除されたりした場合、MSIパッケージを使用して修復できます。
  • パッチ適用: 既存のインストールに対して、差分更新(パッチ)を適用できます。
  • 集中管理: 企業環境でActive Directoryやグループポリシーと連携して、ソフトウェアの展開や管理を効率的に行えます。

技術的詳細

このコミットは、Go言語のWindowsインストーラーのビルドプロセスを根本的に変更しています。

  1. インストーラー定義言語の変更:

    • 従来のInno Setupのスクリプトファイル misc/windows/installer.iss が削除されました。
    • 新たにWiX ToolsetのXML定義ファイル misc/windows/installer.wxs が追加されました。このファイルは、Goのインストールパス、環境変数(GOROOT, GOBIN, PATH)の設定、およびGoツールチェインのファイル群をどのようにMSIパッケージに含めるかを定義します。
  2. ビルドスクリプトの変更:

    • misc/windows/package.bash スクリプトが大幅に修正されました。
    • Inno Setupのコンパイラ ISCC.exe の呼び出しが削除されました。
    • WiX Toolsetのコマンドラインツールである candle.exelight.exeheat.exe の呼び出しが追加されました。
      • heat dir go ... -out AppFiles.wxs: heat ツールを使用して、go ディレクトリ(Goツールチェインのビルド結果が格納される場所)内のすべてのファイルとディレクトリ構造をスキャンし、それらをMSIパッケージに含めるためのWiX XMLフラグメント(AppFiles.wxs)を自動生成します。これにより、Goのファイル構成が変更されても、手動でXMLを更新する手間が省けます。
      • candle -nologo -dVersion=$ver -dArch=$GOARCH -dSourceDir=go installer.wxs AppFiles.wxs: candle ツールは、installer.wxsAppFiles.wxs の両方をコンパイルし、オブジェクトファイル(.wixobj)を生成します。-d オプションは、XML内で使用される変数を定義します。
      • light -nologo installer.wixobj AppFiles.wixobj -o gowin$GOARCH\"_\"$ver.msi: light ツールは、コンパイルされたオブジェクトファイルをリンクし、最終的なMSIパッケージ(gowin<ARCH>_<VERSION>.msi)を生成します。
    • ビルド後には、中間ファイル(.wixobj, AppFiles.wxs, .wixpdb)がクリーンアップされます。
  3. READMEの更新:

    • misc/windows/README ファイルが更新され、Inno Setupの依存関係が削除され、WiX Toolsetの依存関係が追加されました。また、WiXのbinディレクトリをPATHに追加する必要がある旨が追記されました。

この変更により、GoのWindowsインストーラーは、よりWindowsの標準的なインストールメカニズムに準拠し、企業環境での展開や管理が容易になります。

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

misc/windows/README

--- a/misc/windows/README
+++ b/misc/windows/README
@@ -1,13 +1,14 @@
-package.bash packages the Go toolchain for Window\'s in 
-zip and installer (exe) format. 
+package.bash packages the Go toolchain for Windows in 
+zip and installer (msi) format. 
 
 Dependencies
 ============
-- Inno Setup: http://www.jrsoftware.org/isinfo.php
+- WiX Installer XML (WiX) toolset: http://wix.sourceforge.net/
 - 7Zip command-line: http://www.7-zip.org/download.html
 - MinGW/Msys tools
 
 Unzip and place 7za.exe in msys\' bin directory.\n+Add the WiX bin directory to PATH.\n \n Packaging
 =========
  • Window'sWindows に修正され、インストーラー形式が exe から msi に変更されました。
  • 依存関係から Inno Setup が削除され、WiX Installer XML (WiX) toolset が追加されました。
  • WiXのbinディレクトリをPATHに追加する指示が追加されました。

misc/windows/installer.iss (削除)

--- a/misc/windows/installer.iss
+++ /dev/null
@@ -1,98 +0,0 @@
-;; Copyright 2010 The Go Authors.  All rights reserved.
-;; Use of this source code is governed by a BSD-style
-;; license that can be found in the LICENSE file.
-
-[Setup]
-;; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppId={{1AE268D9-FAE4-4EF8-AAE9-3B1B27D604F0}\
-AppName={#AppName}\
-AppVersion={#AppVersion}\
-AppPublisher=golang-nuts@googlegroups.com\
-AppPublisherURL=http://www.golang.org\
-DefaultDirName={sd}\\Go\
-DisableDirPage=yes\
-DefaultGroupName={#AppName}\
-AllowNoIcons=yes\
-OutputBaseFilename={#AppNameLower}win{#AppVersion}_installer\
-Compression=lzma2/max\
-SolidCompression=yes\
-ChangesEnvironment=true\
-OutputDir=.\
-
-[Languages]
-... (言語定義) ...
-
-[Files]
-Source: ".\go\*"; DestDir: "{sd}\Go"; Flags: ignoreversion recursesubdirs createallsubdirs
-
-[Registry]
-... (レジストリ設定、環境変数PATHの変更ロジック) ...
-
-[Icons]
-... (アンインストールショートカット) ...
-
-[Code]
-... (PathCheck関数など、環境変数PATHの操作ロジック) ...
  • Inno Setupのインストーラースクリプト全体が削除されました。これには、アプリケーション情報、言語設定、ファイルコピー、レジストリ操作(環境変数設定を含む)、アンインストールロジックなどが含まれていました。

misc/windows/installer.wxs (新規追加)

<?xml version="1.0" encoding="UTF-8"?>
<!--
# Copyright 2010 The Go Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

  <Product  Id="FF5B30B2-08C2-11E1-85A2-6ACA4824019B"
            Name="The Go Programming Language $(var.Arch) $(var.Version)"
            Language="1033"
            Version="0.0.0.0"
            Manufacturer="http://golang.org"
            UpgradeCode="1C3114EA-08C3-11E1-9095-7FCA4824019B" >
            <!-- Version="$(var.Version)" TODO: Version requires X.X.X.X format -->
            
    <Package    Id='*' Keywords='Installer' 
                Description="The Go Programming Language Installer"
                Comments="The Go programming language is an open source project to make programmers more productive. Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language." 
                InstallerVersion="300"
                Compressed="yes"
                Languages="1033" />

    <Media Id='1' Cabinet="go.cab" EmbedCab="yes" />
    <Condition Message="Windows 2000 or greater required."> VersionNT >= 500</Condition>
    
    <SetDirectory Id="SYS_ROOT" Value="C:\"/>
    <Property Id="EnableEV" Value="1" />
        
        <!-- Define the directory structure and environment variables -->
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="SYS_ROOT">
                <Directory Id="APPLICATIONROOTDIRECTORY" Name="Go"/>

                <Component  Id="GoEnvVars"
                            Guid="067EE394-08EF-11E1-ACBC-43FF4824019B">
                    <CreateFolder />
                    <Environment    Id="GoRootPath"
                                    Action="set" 
                                    Part="all"
                                    Name="GOROOT"
                                    Permanent="no"
                                    System="yes"
                                    Value="C:\Go" />

                    <Environment    Id="GoBinPath"
                                    Action="set" 
                                    Part="all"
                                    Name="GOBIN"
                                    Permanent="no"
                                    System="yes"
                                    Value="C:\Go\bin" />

                    <Environment    Id="Environment"
                                    Action="set" 
                                    Part="last"
                                    Name="PATH"
                                    Permanent="no"
                                    System="yes"
                                    Value="C:\Go\bin" />                         
                </Component>

            </Directory>
        </Directory>

        <!-- Install the files -->
        <Feature    Id="GoTools" 
                    Title="Go" 
                    Level="1">
            <ComponentGroupRef Id="AppFiles" />
            <ComponentRef Id="GoEnvVars" />
        </Feature>   

        <!-- Update the environment -->
        <InstallExecuteSequence>
            <WriteEnvironmentStrings>EnableEV=1</WriteEnvironmentStrings>
        </InstallExecuteSequence>

  </Product>
</Wix>
  • WiXのXML形式でインストーラーの定義が記述されています。
  • <Product> タグで製品情報(ID、名前、バージョン、製造元、アップグレードコード)が定義されます。
  • <Package> タグでパッケージのメタデータ(説明、コメント、インストーラーバージョンなど)が定義されます。特に、Go言語の目的を説明する詳細なコメントが含まれています。
  • <Media> タグでCABファイル(インストールされるファイルを含むアーカイブ)が定義されます。
  • <Condition> タグでOSの最小要件(Windows 2000以上)が指定されています。
  • <Directory> タグでインストール先のディレクトリ構造が定義されます。ここでは C:\Go がデフォルトのインストール先として設定されています。
  • <Component> タグ内で環境変数の設定が行われます。GOROOTGOBIN、そしてPATHへのC:\Go\binの追加が定義されています。Permanent="no" はアンインストール時に環境変数が削除されることを意味します。
  • <Feature> タグでインストールされる機能が定義され、AppFiles (Goのファイル群) と GoEnvVars (環境変数設定) が参照されています。AppFilesheatツールによって生成されるAppFiles.wxsで定義されます。
  • <InstallExecuteSequence> 内の <WriteEnvironmentStrings> は、環境変数の変更をトリガーします。

misc/windows/package.bash

--- a/misc/windows/package.bash
+++ b/misc/windows/package.bash
@@ -1,19 +1,22 @@
 #!/usr/bin/env bash
-# Copyright 2010 The Go Authors.  All rights reserved.\n+# Copyright 2011 The Go Authors.  All rights reserved.\n # Use of this source code is governed by a BSD-style
 # license that can be found in the LICENSE file.\n set -e
 \n-ISCC=\"C:/Program Files/Inno Setup 5/ISCC.exe\"\n+PROGS=\"\n+\tcandle\n+\tlight\n+\theat\n+\"\n \n-echo \"%%%%% Checking for Inno Setup %%%%%\" 1>&2\n-if ! test -f \"$ISCC\"; then\n-\tISCC=\"C:/Program Files (x86)/Inno Setup 5/ISCC.exe\"\n-\tif ! test -f \"$ISCC\"; then\n-\t\techo \"No Inno Setup installation found\" 1>&2\n+\n+echo \"%%%%% Checking for WiX executables %%%%%\" 1>&2\n+for i in $PROGS; do\n+\tif ! which -a $1 >/dev/null; then\n+\t\techo \"Cannot find \'$i\' on search path.\" 1>$2\n \t\texit 1\n \tfi\n-fi\n+done\n \n echo \"%%%%% Checking the packager\'s path %%%%%\" 1>&2\n if ! test -f ../../src/env.bash; then
@@ -38,7 +41,12 @@ cp -a ../../bin go/bin\n echo \"%%%%% Starting zip packaging %%%%%\" 1>&2\n 7za a -tzip -mx=9 gowin$GOARCH\"_\"$ver.zip \"go/\" >/dev/null\n \n+echo \"%%%%% Starting Go directory file harvesting %%%%%\" 1>&2\n+heat dir go -nologo -cg AppFiles -gg -g1 -srd -sfrag -template fragment -dr APPLICATIONROOTDIRECTORY -var var.SourceDir -out AppFiles.wxs\n+\n echo \"%%%%% Starting installer packaging %%%%%\" 1>&2\n-\"$ISCC\" //dAppName=Go //dAppVersion=$GOARCH\"_\"$ver //dAppNameLower=go installer.iss  >/dev/null\n+candle -nologo -dVersion=$ver -dArch=$GOARCH -dSourceDir=go installer.wxs AppFiles.wxs\n+light -nologo installer.wixobj AppFiles.wixobj -o gowin$GOARCH\"_\"$ver.msi\n \n+rm -f *.wixobj AppFiles.wxs *.wixpdb\n \n```
- コピーライトが2010年から2011年に更新されました。
- Inno Setupの実行ファイルパスの定義と、その存在チェックが削除されました。
- WiXの実行ファイル(`candle`, `light`, `heat`)のリスト `PROGS` が定義され、それらが`PATH`上に存在するかどうかのチェックが追加されました。
- Inno Setupのコンパイラ `ISCC` の呼び出しが削除されました。
- `heat` コマンドが追加され、`go` ディレクトリから`AppFiles.wxs`を生成するようになりました。
- `candle` コマンドが追加され、`installer.wxs` と `AppFiles.wxs` をコンパイルするようになりました。
- `light` コマンドが追加され、コンパイルされたオブジェクトファイルをリンクしてMSIパッケージを生成するようになりました。
- ビルド後に生成されるWiXの中間ファイル(`.wixobj`, `AppFiles.wxs`, `.wixpdb`)を削除するクリーンアップコマンドが追加されました。

## コアとなるコードの解説

このコミットの核心は、インストーラー作成ツールをInno SetupからWiX Toolsetへ完全に切り替えた点にあります。

`installer.iss` の削除と `installer.wxs` の追加は、インストーラーの定義方法がスクリプトベースからXMLベースへと変更されたことを示しています。`installer.wxs` は、MSIパッケージの構造を宣言的に記述しており、Goのインストールパス、環境変数の設定、およびGoツールチェインのファイル群をどのように配置するかを定義しています。特に、`Environment` タグを使用して `GOROOT`, `GOBIN`, `PATH` といった重要な環境変数をシステムレベルで設定している点が重要です。これにより、Goのツールがコマンドプロンプトから直接利用できるようになります。

`package.bash` スクリプトの変更は、この新しいビルドプロセスをオーケストレーションする役割を担っています。
1.  `heat dir go ... -out AppFiles.wxs`: このコマンドは、Goのビルド成果物(`go` ディレクトリ以下)を自動的にスキャンし、それらをMSIパッケージに含めるためのXMLフラグメント(`AppFiles.wxs`)を生成します。これにより、Goのバージョンアップやファイル構成の変更があっても、手動でインストーラー定義を更新する手間が大幅に削減されます。これはWiXの強力な機能の一つです。
2.  `candle ... installer.wxs AppFiles.wxs`: `candle` はWiXのコンパイラであり、`installer.wxs`(インストーラーの基本構造と環境変数設定)と `AppFiles.wxs`(Goのファイル群の定義)をコンパイルして、MSIパッケージのビルドに必要な中間ファイル(`.wixobj`)を生成します。
3.  `light ... installer.wixobj AppFiles.wixobj -o gowin$GOARCH\"_\"$ver.msi`: `light` はWiXのリンカーであり、`candle` によって生成された中間ファイルを結合し、最終的なMSIインストーラーパッケージを生成します。

これらの変更により、GoのWindowsインストーラーは、より堅牢で、管理しやすく、Windowsの標準的な展開メカニズムに適合するMSI形式で提供されるようになりました。これは、特に企業環境でのGoの採用を促進する上で重要な改善と言えます。

## 関連リンク

*   **Issue 2394**: [https://code.google.com/p/go/issues/detail?id=2394](https://code.google.com/p/go/issues/detail?id=2394) (このコミットが修正したとされるIssue。リンクは古い可能性があり、現在のGoのIssueトラッカーでは見つからない場合があります。)
*   **Gerrit Change-Id**: [https://golang.org/cl/5339046](https://golang.org/cl/5339046) (GoプロジェクトのGerritレビューシステムにおけるこの変更のリンク)

## 参考にした情報源リンク

*   **WiX Toolset 公式サイト**: [https://wixtoolset.org/](https://wixtoolset.org/)
*   **Inno Setup 公式サイト**: [https://jrsoftware.org/isinfo.php](https://jrsoftware.org/isinfo.php)
*   **Microsoft Installer (MSI) について**:
    *   [https://learn.microsoft.com/ja-jp/windows/win32/msi/windows-installer-portal](https://learn.microsoft.com/ja-jp/windows/win32/msi/windows-installer-portal)
    *   [https://learn.microsoft.com/ja-jp/windows/win32/msi/about-windows-installer](https://learn.microsoft.com/ja-jp/windows/win32/msi/about-windows-installer)
*   **WiX heat tool**: [https://wixtoolset.org/docs/reference/tools/heat/](https://wixtoolset.org/docs/reference/tools/heat/)
*   **WiX candle tool**: [https://wixtoolset.org/docs/reference/tools/candle/](https://wixtoolset.org/docs/reference/tools/candle/)
*   **WiX light tool**: [https://wixtoolset.org/docs/reference/tools/light/](https://wixtoolset.org/docs/reference/tools/light/)
*   **Go Issue 2394 (Google Code Archive)**: [https://code.google.com/archive/p/go/issues/2394](https://code.google.com/archive/p/go/issues/2394) (古いIssueトラッカーのアーカイブ。このIssueがMSIインストーラーへの移行を求めていたことが確認できます。)