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

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

このコミットは、Go言語のWindowsインストーラーに関する修正を含んでいます。具体的には、インストールのデフォルトドライブをC:\に設定し、WiXインストーラー定義ファイルからWin64コンポーネントプロパティを削除することで、Windows環境でのインストールプロセスを改善しています。

コミット

commit f4fc8894241fa4f55075f0ad71398618f929356b
Author: Joe Poirier <jdpoirier@gmail.com>
Date:   Mon Mar 26 16:48:20 2012 +1100

    windows: install fixes
    
    * set default installation drive to C:\
    * remove Win64 component property
    
    R=golang-dev, bradfitz, aram
    CC=golang-dev
    https://golang.org/cl/5901044

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

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

元コミット内容

windows: install fixes

* set default installation drive to C:\
* remove Win64 component property

変更の背景

このコミットは、Go言語のWindowsインストーラーが抱えていた問題を解決するために行われました。主な問題点は以下の2つと考えられます。

  1. デフォルトインストールパスの不確実性: 以前のインストーラーでは、デフォルトのインストールドライブが明示的にC:\に設定されていなかった可能性があります。これにより、ユーザーの環境によっては意図しないドライブにインストールされたり、インストールパスの決定に一貫性がなかったりする問題が発生していたかもしれません。C:\をデフォルトとすることで、より予測可能で標準的なインストール体験を提供できます。
  2. Win64プロパティの誤用または冗長性: WiX (Windows Installer XML) ツールセットでインストーラーを作成する際、Win64プロパティはコンポーネントが64ビットシステムにのみインストールされるべきであることを示すために使用されます。しかし、このプロパティが不適切に使用されていたか、あるいは特定のコンポーネントに対しては冗長であった可能性があります。例えば、インストーラー全体が64ビットをターゲットとしている場合、個々のコンポーネントにWin64を明示的に設定する必要がない、または設定することで予期せぬ挙動を引き起こす可能性がありました。この修正は、インストーラーの動作をより堅牢にし、潜在的な互換性問題を解消することを目的としています。

これらの修正により、Go言語のWindowsインストーラーの信頼性とユーザーエクスペリエンスが向上しました。

前提知識の解説

このコミットを理解するためには、以下の技術的背景知識が役立ちます。

1. Windows Installer (MSI) と WiX Toolset

  • Windows Installer (MSI): Microsoftが提供するソフトウェアのインストール、メンテナンス、削除を行うためのフレームワークです。.msiファイルは、インストールに必要なすべての情報(ファイル、レジストリエントリ、ショートカットなど)を含むデータベースです。
  • WiX Toolset (Windows Installer XML): MSIパッケージを作成するためのオープンソースのツールセットです。XML形式でインストーラーの動作を定義し、それをコンパイルしてMSIファイルを生成します。開発者は、C++やC#のようなプログラミング言語ではなく、XMLを使ってインストーラーを記述できます。

2. WiXにおけるディレクトリとプロパティ

  • Directory要素: インストール先のファイルシステム上のディレクトリ構造を定義します。
  • SetDirectory要素: 特定のディレクトリの値を設定するために使用されます。このコミットでは、INSTALLDIRROOTというディレクトリの値を[%SYSTEMDRIVE]に設定しています。
  • SYSTEMDRIVEプロパティ: Windows Installerの標準プロパティの一つで、Windowsがインストールされているドライブのルートパス(例: C:\)を返します。[%SYSTEMDRIVE]のように角括弧で囲むことで、このプロパティの実行時値を取得できます。
  • Component要素: インストールされるファイルのグループ、レジストリエントリ、ショートカットなどを定義する論理的な単位です。各コンポーネントには一意のGUIDが割り当てられます。
  • Win64属性: Component要素の属性で、そのコンポーネントが64ビットシステムにのみインストールされるべきであることを示します。この属性がyesに設定されている場合、32ビットシステムではそのコンポーネントはインストールされません。このコミットでは、この属性が削除されています。

3. 条件付きコンパイル (<?if?>, <?else?>, <?endif?>)

WiXのXMLファイルでは、プリプロセッサディレクティブを使用して条件付きコンパイルを行うことができます。これは、異なるビルドターゲット(例: 32ビットと64ビット)に対して異なる設定を適用する際に便利です。

  • <?if?>: 条件が真の場合に続くXMLを処理します。
  • <?else?>: <?if?>の条件が偽の場合に続くXMLを処理します。
  • <?endif?>: 条件付きブロックの終わりを示します。

このコミットの変更箇所では、IsX64Targetという変数の定義が条件付きコンパイルブロック内にありました。

技術的詳細

このコミットは、misc/dist/windows/installer.wxsというWiXインストーラー定義ファイルを変更しています。主な変更点は以下の通りです。

  1. IsX64Target変数の削除:

    • 以前のコードでは、32ビットビルドと64ビットビルドを区別するためにIsX64TargetというWiX変数が定義されていました。
    • 32ビットビルドの場合、<?define IsX64Target = no ?>と設定されていました。
    • 64ビットビルドの場合、<?define IsX64Target = yes ?>と設定されていました。
    • このコミットでは、これらの定義が削除されています。これは、インストーラーのビルドプロセスがWin64のターゲットをより直接的に扱うようになったか、あるいはこの変数が特定のコンポーネントのWin64属性に直接バインドされる必要がなくなったことを示唆しています。
  2. デフォルトインストールドライブの設定:

    • <MajorUpgrade AllowDowngrades="yes" />タグの直後に、<SetDirectory Id="INSTALLDIRROOT" Value="[%SYSTEMDRIVE]"/>という新しい行が追加されました。
    • これは、INSTALLDIRROOTという内部的なディレクトリプロパティの値を、Windowsがインストールされているドライブのルート(例: C:\)に設定することを意味します。これにより、GoのデフォルトインストールパスがC:\Goのようになるなど、インストーラーが常にC:\ドライブを基準に動作するようになります。
  3. Win64コンポーネントプロパティの削除:

    • Component Id="Component_GoProgramShortCuts"Component Id="Component_GoEnvironment"の2つのComponent要素から、Win64="$(var.IsX64Target)"という属性が削除されました。
    • 以前は、これらのコンポーネントのWin64属性は、前述のIsX64Target変数の値に依存していました。この属性が削除されたことで、これらのコンポーネントは、インストーラー全体のターゲットプラットフォーム(32ビットまたは64ビット)に基づいて自動的に適切な動作をするようになります。これは、WiXが提供するより一般的な64ビット対応のメカニズム(例: <Package Platform="x64" />)に依存するようになったことを示唆しており、個々のコンポーネントレベルでの明示的なWin64指定が不要になった、または不適切になったことを意味します。

これらの変更は、GoのWindowsインストーラーの堅牢性を高め、特に64ビットシステムでのインストールプロセスを簡素化し、より標準的な挙動に近づけることを目的としています。

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

diff --git a/misc/dist/windows/installer.wxs b/misc/dist/windows/installer.wxs
index 20f261f9d0..b170b98dc4 100644
--- a/misc/dist/windows/installer.wxs
+++ b/misc/dist/windows/installer.wxs
@@ -10,12 +10,10 @@
   <?define ProdId = {FF5B30B2-08C2-11E1-85A2-6ACA4824019B} ?>
   <?define UpgradeCode = {1C3114EA-08C3-11E1-9095-7FCA4824019B} ?>
   <?define SysFolder=SystemFolder ?>
-  <?define IsX64Target = no ?>
 <?else?>
   <?define ProdId = {716c3eaa-9302-48d2-8e5e-5cfec5da2fab} ?>
   <?define UpgradeCode = {22ea7650-4ac6-4001-bf29-f4b8775db1c0} ?>
   <?define SysFolder=System64Folder ?>
-  <?define IsX64Target = yes ?>
 <?endif?>
 
 <Product
@@ -51,6 +49,7 @@
 <Media Id='1' Cabinet="go.cab" EmbedCab="yes" CompressionLevel="high" />
 <Condition Message="Windows 2000 or greater required."> VersionNT >= 500</Condition>
 <MajorUpgrade AllowDowngrades="yes" />
+<SetDirectory Id="INSTALLDIRROOT" Value="[%SYSTEMDRIVE]"/>
 
 <CustomAction
     Id="SetApplicationRootDirectory"
@@ -72,7 +71,7 @@
 
 <!-- Programs Menu Shortcuts -->
 <DirectoryRef Id="GoProgramShortcutsDir">
-  <Component Id="Component_GoProgramShortCuts" Guid="{f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b}" Win64="$(var.IsX64Target)">
+  <Component Id="Component_GoProgramShortCuts" Guid="{f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b}">
         <Shortcut
             Id="GoDocServerStartMenuShortcut"
             Name="GoDocServer"
@@ -102,7 +101,7 @@
 
 <!-- Registry & Environment Settings -->
 <DirectoryRef Id="GoEnvironmentEntries">
-  <Component Id="Component_GoEnvironment" Guid="{3ec7a4d5-eb08-4de7-9312-2df392c45993}" Win64="$(var.IsX64Target)">
+  <Component Id="Component_GoEnvironment" Guid="{3ec7a4d5-eb08-4de7-9312-2df392c45993}">
         <RegistryKey
             Root="HKCU"
             Key="Software\GoProgrammingLanguage"

コアとなるコードの解説

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

  1. IsX64Target変数の削除 (-4行):

    -  <?define IsX64Target = no ?>
    ...
    -  <?define IsX64Target = yes ?>
    

    この部分では、WiXのプリプロセッサディレクティブ内で定義されていたIsX64Targetという変数の定義が削除されています。以前は、この変数がインストーラーがターゲットとするアーキテクチャ(32ビットまたは64ビット)を示すために使用されていました。この削除は、インストーラーのビルドシステムがこの情報をより直接的に処理するようになったか、あるいはこの変数が不要になったことを意味します。

  2. デフォルトインストールドライブの設定 (+1行):

    +<SetDirectory Id="INSTALLDIRROOT" Value="[%SYSTEMDRIVE]"/>
    

    この行は新しく追加されたもので、INSTALLDIRROOTというWiXの内部ディレクトリプロパティの値を、Windowsがインストールされているシステムドライブのルート(例: C:\)に設定しています。これにより、GoのインストーラーはデフォルトでC:\ドライブを基準としてインストールパスを決定するようになり、インストールの一貫性が向上します。

  3. Win64コンポーネントプロパティの削除 (-2行):

    -  <Component Id="Component_GoProgramShortCuts" Guid="{f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b}" Win64="$(var.IsX64Target)">
    ...
    -  <Component Id="Component_GoEnvironment" Guid="{3ec7a4d5-eb08-4de7-9312-2df392c45993}" Win64="$(var.IsX64Target)">
    

    Component_GoProgramShortCutsComponent_GoEnvironmentという2つのコンポーネント定義から、Win64="$(var.IsX64Target)"という属性が削除されています。この属性は、コンポーネントが64ビットシステムにのみインストールされるべきであることを示していました。この削除は、これらのコンポーネントがインストーラー全体のターゲットアーキテクチャに自動的に適応するようになったため、個別にWin64属性を指定する必要がなくなったことを意味します。これは、WiXのより現代的な64ビット対応のプラクティスに沿った変更と考えられます。

これらの変更は全体として、GoのWindowsインストーラーの堅牢性と互換性を向上させ、特に64ビット環境でのインストールプロセスをよりスムーズにするためのものです。

関連リンク

参考にした情報源リンク