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

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

このコミットは、Go言語のWindowsインストーラー(MSI)の機能改善に関する中間チェックインです。主な変更点として、ユーザーがGoのインストールディレクトリを任意に選択できるようになり、プログラムメニューにGoフォルダが追加され、デスクトップにGo環境設定用とgodocサーバー起動用のショートカットが配置されるようになりました。また、Go環境設定用のバッチファイル(goenv.bat)とgodocサーバー起動用のバッチファイル(godocserver.bat)が新規に追加され、インストーラーのWix定義ファイル(installer.wxs)が大幅に更新されています。これにより、WindowsユーザーのGo開発環境のセットアップがより簡単かつ効率的になることを目指しています。

コミット

commit 984b4e381dc571e961934acbd5d4af329ae8afb9
Author: Joe Poirier <jdpoirier@gmail.com>
Date:   Thu Nov 17 17:54:06 2011 -0600

    misc/windows packager development intermediate check-in
    
    The installer now: allows a user to select an alternative
    install directory, it now adds a Go folder to the Programs
    Menu, and it places two shortcuts on the user's desktop.
    The Program Menu folder contains shortcuts to the uninstaller
    and two batch files, go.bat and godoc.bat. The desktop
    shortcuts also point to go.bat and godoc.bat.
    
    go.bat sets the Go environment, including Path, and spawns a
    Window's shell. godoc.bat starts the godoc server at
    localhost:6060 then spawns a browser window pointing to the
    document server.
    
    Setting the environment temporarily and spawning a shell, via
    go.bat, should be safer than messing with the system's environment
    and it makes the user experience a bit more streamlined.
    
    The packager does work in its current state but it still needs
    some polishing. And yes, the plan is to add a dialogue to allow
    the user to decline the desktop shortcuts.
    
    R=rsc, alex.brainman, tjyang2001
    CC=golang-dev
    https://golang.org/cl/5399042

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

https://github.com/golang/go/commit/984b4e381dc571e961934acbd5d4af329ae8afb9

元コミット内容

misc/windows packager development intermediate check-in

The installer now: allows a user to select an alternative
install directory, it now adds a Go folder to the Programs
Menu, and it places two shortcuts on the user's desktop.
The Program Menu folder contains shortcuts to the uninstaller
and two batch files, go.bat and godoc.bat. The desktop
shortcuts also point to go.bat and godoc.bat.

go.bat sets the Go environment, including Path, and spawns a
Window's shell. godoc.bat starts the godoc server at
localhost:6060 then spawns a browser window pointing to the
document server.

Setting the environment temporarily and spawning a shell, via
go.bat, should be safer than messing with the system's environment
and it makes the user experience a bit more streamlined.

The packager does work in its current state but it still needs
some polishing. And yes, the plan is to add a dialogue to allow
the user to decline the desktop shortcuts.

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

変更の背景

この変更の背景には、Go言語のWindowsユーザーがより簡単に開発環境をセットアップできるようにするという目的があります。以前のインストーラーでは、インストールパスの選択肢が限られていたり、環境変数の設定がシステム全体に影響を与えたりする可能性がありました。

このコミットでは、以下の課題を解決しようとしています。

  1. インストールパスの柔軟性: ユーザーがGoをインストールするディレクトリを自由に選択できるようにすることで、既存のシステム構成との競合を避け、よりパーソナライズされた環境構築を可能にします。
  2. 環境設定の安全性と利便性: システムの環境変数を永続的に変更するのではなく、Go開発用のシェルを起動する際に一時的に環境を設定するアプローチを採用することで、システム全体の安定性を保ちつつ、Go開発に必要な環境を簡単に利用できるようにします。これにより、ユーザーはGoのバージョン管理や複数のGo環境の切り替えをより安全に行えるようになります。
  3. アクセス性の向上: プログラムメニューやデスクトップにショートカットを配置することで、Goコマンドラインツールやgodocサーバーへのアクセスを容易にし、ユーザーエクスペリエンスを向上させます。特にgodocはGoのドキュメントをローカルで参照するための重要なツールであり、その起動を簡素化することは開発者にとって大きなメリットとなります。
  4. インストーラーの機能強化: WiX Toolsetを用いたインストーラーの定義を改善し、より洗練されたインストールプロセスを提供することを目指しています。

これらの改善は、Go言語のWindowsユーザーベースを拡大し、開発者の生産性を向上させるための重要なステップでした。

前提知識の解説

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

  1. Go言語の環境変数 (GOROOT, GOBIN, PATH):

    • GOROOT: Goのインストールディレクトリのルートパスを指します。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリ以下に配置されます。
    • GOBIN: Goの実行可能ファイル(goコマンド、gofmtなど)がインストールされるディレクトリを指します。通常は$GOROOT/binに設定されます。
    • PATH: オペレーティングシステムが実行可能ファイルを探すディレクトリのリストです。GOBINPATHに追加することで、コマンドプロンプトやPowerShellからGoのツールを直接実行できるようになります。
    • このコミットでは、システム全体のPATHを永続的に変更するのではなく、Go開発用のシェルを起動する際に一時的にこれらの環境変数を設定するアプローチが取られています。
  2. godocコマンドとgodocサーバー:

    • godocはGoのドキュメンテーションツールです。Goのソースコードからコメントや宣言を抽出し、HTML形式で表示したり、コマンドラインで検索したりできます。
    • godoc -http=:6060のように実行すると、ローカルのWebサーバーとして起動し、ブラウザからGoの標準ライブラリやインストールされているパッケージのドキュメントを参照できるようになります。これはGo開発において非常に重要なリソースです。
  3. Windows Installer (MSI):

    • Microsoft Windows Installerは、Windowsオペレーティングシステムにおけるソフトウェアのインストール、メンテナンス、削除のための標準的なフレームワークです。.msiファイルは、インストールに必要なすべての情報(ファイル、レジストリエントリ、ショートカットなど)を含むデータベースです。
  4. WiX Toolset (Windows Installer XML):

    • WiX Toolsetは、Microsoftが開発したオープンソースのツールセットで、XMLコードを使用してWindows Installerパッケージ(MSI)を構築するために使用されます。開発者はXMLファイルでインストールのロジック、ファイル、レジストリエントリ、ショートカットなどを定義し、WiXコンパイラ(candle.exe)とリンカー(light.exe)を使用してMSIファイルを生成します。
    • installer.wxsはWiXのソースファイルであり、インストーラーの振る舞いを定義します。
    • Product要素: MSIパッケージの最上位要素で、製品のID、名前、バージョン、製造元などを定義します。
    • Package要素: MSIパッケージの一般的な属性(圧縮形式、言語など)を定義します。
    • Directory要素: インストール先のディレクトリ構造を定義します。
    • Component要素: インストールされる個々のリソース(ファイル、レジストリエントリ、ショートカットなど)を定義します。各コンポーネントにはGUIDが割り当てられ、インストーラーがコンポーネントのインストール状態を追跡するために使用します。
    • Feature要素: ユーザーがインストール時に選択できる機能のグループを定義します。
    • Shortcut要素: デスクトップやスタートメニューに作成されるショートカットを定義します。
    • CustomAction: インストールプロセス中に実行されるカスタムアクション(例: 環境変数の設定、スクリプトの実行)を定義します。
    • WixUIExtension: WiX Toolsetが提供する標準的なユーザーインターフェース(UI)拡張機能です。これにより、インストールパスの選択ダイアログなどが簡単に実装できます。
  5. バッチファイル (.bat):

    • Windowsのコマンドプロンプトで実行されるスクリプトファイルです。一連のコマンドを自動的に実行するために使用されます。
    • @echo off: コマンドの実行結果を非表示にします。
    • setlocal/endlocal: 環境変数の変更をバッチファイルの実行スコープに限定します。endlocalが実行されると、setlocal以降の環境変数の変更は元に戻ります。これにより、システム全体の環境を汚染することなく、一時的な環境設定が可能になります。
    • for /f "delims=" %%i in ('cd') do set cwd=%%i: 現在の作業ディレクトリを取得し、cwd変数に設定します。
    • start: 新しいウィンドウでプログラムやドキュメントを開きます。
    • %~dpi: バッチファイル自身のパスからドライブとパスのみを取得します。

技術的詳細

このコミットにおける技術的な変更は、主にGo言語のWindowsインストーラーの機能とユーザーエクスペリエンスを向上させることに焦点を当てています。

  1. WiX定義ファイル (misc/windows/installer.wxs) の大幅な変更:

    • インストールディレクトリの選択: 以前は固定されていたインストールパスが、ユーザーが選択できるように変更されました。これは、WixUI_InstallDir UI拡張機能の導入と、INSTALLDIRプロパティの利用によって実現されています。
      • SetDirectory Id="INSTALLDIRROOT" Value="C:\\": インストールルートのデフォルト値をC:\に設定。
      • Directory Id="INSTALLDIR" Name="Go": INSTALLDIRROOTの下にGoディレクトリを作成するよう定義。
      • Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR": UIでINSTALLDIRプロパティを操作できるように設定。
      • <UIRef Id="WixUI_InstallDir" />: インストールディレクトリ選択UIを組み込み。
    • プログラムメニューとデスクトップショートカットの追加:
      • ProgramMenuFolderDesktopFolderディレクトリが定義され、その中にGo関連のショートカットが作成されるようになりました。
      • GoProgramShortcutsDirという新しいディレクトリがプログラムメニュー内に作成され、その中にGo環境設定、godocサーバー起動、アンインストーラーへのショートカットが配置されます。
      • デスクトップにはGo環境設定とgodocサーバー起動のショートカットが直接配置されます。
      • ショートカットは、新しく追加されたバッチファイル(goenv.batgodocserver.bat)をターゲットとしています。
      • アンインストーラーへのショートカットは、msiexec.exe /x [ProductCode]コマンドを実行することで、現在の製品をアンインストールするように設定されています。
    • 環境変数の設定方法の変更:
      • 以前のバージョンでは、インストーラーが直接システム環境変数GOROOT, GOBIN, PATHを永続的に設定していました。
      • このコミットでは、これらの環境変数をインストーラーが直接設定するのではなく、goenv.batというバッチファイル内で一時的に設定し、その環境で新しいコマンドプロンプトを起動する方式に変更されました。これにより、システム全体の環境を汚染することなく、Go開発に必要な環境を安全に提供できるようになります。
      • CustomAction Id="SetApplicationRootDirectory"が追加され、ARPINSTALLLOCATIONプロパティにINSTALLDIRの値を設定しています。これは、コントロールパネルの「プログラムと機能」で表示されるアプリケーションのインストール場所情報に使用されます。
    • アーキテクチャ判定の追加:
      • <?if $(var.Arch) = 386 ?>のようなWiXプリプロセッサディレクティブが追加され、ビルド時のアーキテクチャ(386またはamd64)に基づいて、適切なシステムフォルダ(SystemFolderまたはSystem64Folder)が選択されるようになりました。これにより、32ビットと64ビットのWindowsシステム両方に対応したインストーラーを生成できます。
    • コメントの追加と整理: WiX XMLファイル内のコメントが整理され、より理解しやすくなっています。
  2. 新規バッチファイル (misc/windows/godocserver.batmisc/windows/goenv.bat) の追加:

    • godocserver.bat:
      • このバッチファイルは、godoc.exeが存在するかどうかをチェックし、存在しない場合はエラーメッセージを表示します。
      • start bin\godoc -http=localhost:6060 -goroot="%cwd%": godocサーバーをlocalhost:6060で起動します。-gorootオプションで現在のGoインストールディレクトリを明示的に指定しています。
      • start http://localhost:6060: 起動したgodocサーバーのURLをデフォルトのWebブラウザで開きます。
      • setlocal/endlocalを使用することで、このバッチファイル内で設定される環境変数が、バッチファイルの実行終了後に自動的に元に戻るようにしています。
    • goenv.bat:
      • このバッチファイルは、Goのコンパイラ(6g.exeまたは8g.exe)が存在するかどうかをチェックし、Goのアーキテクチャ(amd64または386)を判定します。
      • set GOROOT=%cwd%: 現在のGoインストールディレクトリをGOROOTに設定します。
      • set GOBIN=%GOROOT%\bin: GOBIN%GOROOT%\binに設定します。
      • set PATH=%GOBIN%;%PATH%: GOBINを既存のPATHの先頭に追加します。これにより、Goのツールが優先的に検索されるようになります。
      • @CMD /F:ON: 新しいコマンドプロンプトウィンドウを起動し、その中でGoの環境変数が設定された状態にします。/F:ONはファイルとディレクトリ名の補完を有効にするオプションです。
      • こちらもsetlocal/endlocalを使用しており、このバッチファイルから起動されたコマンドプロンプト内でのみGoの環境変数が有効になります。
  3. misc/windows/package.bash の変更:

    • heatコマンドの-drオプションの値がAPPLICATIONROOTDIRECTORYからINSTALLDIRに変更されました。これは、WiX定義ファイル内のディレクトリIDの変更に合わせたものです。heatはWiX Toolsetの一部で、既存のディレクトリ構造からWiXコンポーネントとファイル定義を自動生成するために使用されます。
    • lightコマンドに-ext WixUIExtension -ext WixUtilExtensionオプションが追加されました。これにより、WiX UI拡張機能とWiXユーティリティ拡張機能がリンカーに明示的に渡され、インストーラーにUI機能が組み込まれるようになります。

これらの変更により、GoのWindowsインストーラーはより堅牢で、ユーザーフレンドリーなものになりました。特に、環境変数を一時的に設定するアプローチは、システムへの影響を最小限に抑えつつ、Go開発を始めるための障壁を低くする点で重要です。

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

このコミットで変更された主要なファイルは以下の通りです。

  • misc/windows/LICENSE: 新規追加。Goのライセンスファイル。
  • misc/windows/godocserver.bat: 新規追加。godocサーバーを起動し、ブラウザで開くためのバッチファイル。
  • misc/windows/goenv.bat: 新規追加。Goの環境変数を設定し、新しいコマンドシェルを起動するためのバッチファイル。
  • misc/windows/installer.wxs: 既存ファイルの変更。WiXインストーラーの定義ファイル。インストールパスの選択、プログラムメニュー/デスクトップショートカットの追加、環境設定ロジックの変更など、大幅な修正が行われています。
  • misc/windows/package.bash: 既存ファイルの変更。インストーラーパッケージングスクリプト。heatおよびlightコマンドの引数が更新されています。

コアとなるコードの解説

misc/windows/installer.wxs (抜粋と解説)

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <!-- ... (既存のコメントと定義) ... -->

  <?if $(var.Arch) = 386 ?>
    <?define SYSFOLDER=SystemFolder ?>
    <?define Win64=no ?>
  <?else?>
    <?define SYSFOLDER=System64Folder ?>
    <?define Win64=yes ?>
  <?endif?>

  <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" >
      <!-- ... (Product, Package, Media, Condition要素) ... -->

      <SetDirectory Id="INSTALLDIRROOT" Value="C:\"/>

      <CustomAction
          Id="SetApplicationRootDirectory"
          Property="ARPINSTALLLOCATION"
          Value="[INSTALLDIR]" />

      <!-- Define the directory structure and environment variables -->
      <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="INSTALLDIRROOT">
          <Directory Id="INSTALLDIR" Name="Go"/>
        </Directory>
        <Directory Id="ProgramMenuFolder">
          <Directory Id="GoProgramShortcutsDir" Name="Go Programming"/>
        </Directory>
        <Directory Id="DesktopFolder" Name="Desktop"/>
      </Directory>

      <!-- Programs Menu & Desktop Shortcuts -->
      <DirectoryRef Id="GoProgramShortcutsDir">
        <Component Id="Component_GoShortCuts" Guid="f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b">
          <Shortcut
              Id="GoEnvStartMenuShortcut"
              Name="GoEnv"
              Description="Sets the Go environment and spawns a shell window"
              Target="[INSTALLDIR]goenv.bat" />
          <Shortcut
              Id="GoEnvDesktopShortcut"
              Directory="DesktopFolder"
              Name="GoEnv"
              Description="Sets the Go environment and spawns a shell window"
              Target="[INSTALLDIR]goenv.bat" />
          <Shortcut
              Id="GoDocServerStartMenuShortcut"
              Name="GoDocServer"
              Description="Starts the godoc server on localhost:6060"
              Target="[INSTALLDIR]godocserver.bat" />
          <Shortcut
              Id="GoDocServerDesktopShortcut"
              Directory="DesktopFolder"
              Name="GoDocServer"
              Description="Starts the godoc server on localhost:6060"
              Target="[INSTALLDIR]godocserver.bat" />
          <Shortcut
              Id="UninstallShortcut"
              Name="Uninstall Go"
              Description="Uninstalls Go and all of its components"
              Target="[$(var.SYSFOLDER)]msiexec.exe"
              Arguments="/x [ProductCode]" />
          <RemoveFolder
              Id="GoProgramShortcutsDir"
              On="uninstall" />
          <RegistryValue
              Root="HKCU"
              Key="Software\Microsoft\TheGoProgrammingLanguage"
              Name="installed"
              Type="integer"
              Value="1"
              KeyPath="yes" />
        </Component>
      </DirectoryRef>

      <!-- Components -->
      <DirectoryRef Id="INSTALLDIR">
        <Component Id="Component_GoDocServerBAT" Guid="c40ea60a-4290-4a91-864d-e1d8eb5cf693">
          <File
              Id="FILE_GoDocServerBat"
              Source="godocserver.bat"
              KeyPath="yes" />
        </Component>
        <Component Id="Component_GoEnvBAT" Guid="ee4587d3-fba3-47f9-b45e-ec9ca9c8a9c3">
          <File
              Id="FILE_GoEnvBat"
              Source="goenv.bat"
              KeyPath="yes" />
        </Component>
      </DirectoryRef>

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

      <!-- Update the environment -->
      <InstallExecuteSequence>
        <Custom
          Action="SetApplicationRootDirectory"
          Before="InstallFinalize" />
      </InstallExecuteSequence>

      <!-- Include the user interface -->
      <WixVariable Id="WixUILicenseRtf" Value="LICENSE" />
      <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
      <UIRef Id="WixUI_InstallDir" />

  </Product>
</Wix>

解説:

  • <?if $(var.Arch) ... ?>: ビルド時のアーキテクチャに応じてSYSFOLDER変数を設定し、32ビット/64ビットシステムに対応したパスを動的に生成します。
  • SetDirectory Id="INSTALLDIRROOT" Value="C:\\": インストール先のルートディレクトリのデフォルト値をC:\に設定します。
  • CustomAction Id="SetApplicationRootDirectory": インストール完了前に実行されるカスタムアクションで、コントロールパネルに表示されるアプリケーションのインストール場所を設定します。
  • Directory要素群: インストール先のディレクトリ構造を定義します。INSTALLDIRがGoのインストールルート、ProgramMenuFolderDesktopFolderがそれぞれプログラムメニューとデスクトップに対応します。
  • DirectoryRef Id="GoProgramShortcutsDir"内のComponent_GoShortCuts:
    • Shortcut要素で、goenv.batgodocserver.batへのショートカットをプログラムメニューとデスクトップに作成します。
    • UninstallShortcutは、msiexec.exeを使ってGoをアンインストールするためのショートカットです。
    • RemoveFolderは、アンインストール時にプログラムメニューのGoフォルダを削除します。
    • RegistryValueは、インストールされたことを示すレジストリエントリを作成します。
  • DirectoryRef Id="INSTALLDIR"内のComponent_GoDocServerBATComponent_GoEnvBAT:
    • それぞれgodocserver.batgoenv.batファイルをGoのインストールディレクトリに配置するためのコンポーネントです。KeyPath="yes"は、このファイルがコンポーネントのキーパスであることを示し、インストーラーがコンポーネントの存在を判断するために使用します。
  • Feature Id="GoTools": インストールされる機能のグループを定義し、上記のコンポーネントを参照します。
  • InstallExecuteSequence内のCustom Action="SetApplicationRootDirectory": インストール実行シーケンスのInstallFinalizeアクションの前にSetApplicationRootDirectoryカスタムアクションを実行するよう指定します。
  • WixVariable Id="WixUILicenseRtf" Value="LICENSE": ライセンスファイルとしてLICENSEを使用することをUIに伝えます。
  • Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"UIRef Id="WixUI_InstallDir": WiXの標準UI拡張機能であるWixUI_InstallDirを使用し、ユーザーがインストールディレクトリを選択できるようにします。

misc/windows/godocserver.bat

@echo off
setlocal
for /f "delims=" %%i in ('cd') do set cwd=%%i

if exist bin\godoc.exe goto ok
echo Unable to find the godoc executable
echo This batch file must run from the root Go folder
pause
exit

:ok
start bin\godoc -http=localhost:6060 -goroot="%cwd%"
start http://localhost:6060
endlocal

解説:

  • @echo off: コマンドの表示をオフにします。
  • setlocal: バッチファイル内で設定される環境変数をローカルスコープに限定します。
  • for /f "delims=" %%i in ('cd') do set cwd=%%i: 現在の作業ディレクトリをcwd変数に格納します。
  • if exist bin\godoc.exe goto ok: binディレクトリにgodoc.exeが存在するかチェックします。存在しない場合はエラーメッセージを表示して終了します。
  • start bin\godoc -http=localhost:6060 -goroot="%cwd%": godocサーバーをlocalhost:6060で起動します。-gorootオプションで現在のGoインストールパスを明示的に指定することで、godocが正しいGoのソースコードを見つけられるようにします。
  • start http://localhost:6060: デフォルトのWebブラウザでgodocサーバーのURLを開きます。
  • endlocal: setlocalで設定されたローカル環境変数を元に戻します。

misc/windows/goenv.bat

@echo off
setlocal
for /f %%i in ("%0") do set cwd=%%~dpi
cd /d %cwd%

:: sanity checks
if exist "%cwd%"\bin\6g.exe (
set GOARCH=amd64
goto ok
)

if exist "%cwd%"\bin\8g.exe (
set GOARCH=386
goto ok
)

echo Unable to find the Go compiler
echo This batch file must run from the root Go folder
pause
exit

:ok
set GOROOT=%cwd%
set GOBIN=%GOROOT%\bin
set PATH=%GOBIN%;%PATH%

@CMD /F:ON
endlocal

解説:

  • @echo offsetlocal: godocserver.batと同様。
  • for /f %%i in ("%0") do set cwd=%%~dpi: このバッチファイル自身のディレクトリパスをcwd変数に格納します。これにより、バッチファイルがどこから実行されてもGoのインストールルートを正しく特定できます。
  • cd /d %cwd%: 現在のディレクトリをGoのインストールルートに変更します。
  • if exist "%cwd%"\bin\6g.exe (...) / if exist "%cwd%"\bin\8g.exe (...): Goのコンパイラ(64ビット版の6g.exeまたは32ビット版の8g.exe)の存在をチェックし、それに基づいてGOARCH環境変数を設定します。
  • set GOROOT=%cwd%: GOROOTをGoのインストールルートに設定します。
  • set GOBIN=%GOROOT%\bin: GOBIN%GOROOT%\binに設定します。
  • set PATH=%GOBIN%;%PATH%: GOBINを既存のPATH環境変数の先頭に追加します。これにより、このバッチファイルから起動されるシェル内でGoのコマンドが利用可能になります。
  • @CMD /F:ON: 新しいコマンドプロンプトウィンドウを起動し、その中で上記で設定されたGoの環境変数が有効になります。/F:ONはファイルとディレクトリ名の補完を有効にするオプションです。
  • endlocal: setlocalで設定されたローカル環境変数を元に戻します。これにより、このバッチファイルから起動されたシェルを閉じると、Goの環境変数はシステムから消え、システム全体の環境に影響を与えません。

misc/windows/package.bash (抜粋)

# ... (既存のスクリプト) ...

echo "%%%%% Starting Go directory file harvesting %%%%%" 1>&2
heat dir go -nologo -cg AppFiles -gg -g1 -srd -sfrag -template fragment -dr INSTALLDIR -var var.SourceDir -out AppFiles.wxs

echo "%%%%% Starting installer packaging %%%%%" 1>&2
candle -nologo -dVersion=$ver -dArch=$GOARCH -dSourceDir=go installer.wxs AppFiles.wxs
light -nologo -ext WixUIExtension -ext WixUtilExtension installer.wixobj AppFiles.wixobj -o gowin$GOARCH"_"$ver.msi

# ... (既存のスクリプト) ...

解説:

  • heat dir go ... -dr INSTALLDIR ...: heatコマンドは、Goのインストールディレクトリ(go)からファイルとディレクトリ構造をスキャンし、WiXのXMLフラグメント(AppFiles.wxs)を生成します。-dr INSTALLDIRは、生成されるXML内のディレクトリ参照がINSTALLDIRをルートとすることを指定します。これはinstaller.wxs内のINSTALLDIRと連携します。
  • light -nologo -ext WixUIExtension -ext WixUtilExtension ...: lightコマンドは、candleでコンパイルされたオブジェクトファイル(.wixobj)をリンクして最終的なMSIパッケージを生成します。-ext WixUIExtension -ext WixUtilExtensionは、WiXのUI拡張機能とユーティリティ拡張機能を明示的にリンクに含めることを指示します。これにより、インストーラーにGUIが提供され、インストールパスの選択などの機能が利用可能になります。

これらの変更は、GoのWindowsインストーラーをより堅牢で、ユーザーフレンドリーなものにするための重要なステップでした。特に、環境変数を一時的に設定するアプローチは、システムへの影響を最小限に抑えつつ、Go開発を始めるための障壁を低くする点で重要です。

関連リンク

参考にした情報源リンク