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

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

このコミットは、Go言語のWindowsインストーラー(misc/dist/windows/installer.wxs)に対する更新です。主な変更点は、インストーラーがGoのインストール時にGOROOT環境変数を適切に設定するようになったこと、および関連するバグ修正です。

コミット

commit e9fef33dd8b33c0948c6e7cb202a7192af186edb
Author: Andrew Gerrand <adg@golang.org>
Date:   Fri Mar 23 11:48:54 2012 +1100

    misc/dist: updates to installer script

    Now sets GOROOT.

    Fixes #3287.
    Fixes #3361.

    R=golang-dev
    CC=golang-dev
    https://golang.org/cl/5877059

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

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

元コミット内容

このコミットの元の内容は、Go言語のWindowsインストーラーに関するスクリプトの更新です。具体的には、インストーラーがGOROOT環境変数を設定するようになり、Issue #3287とIssue #3361を修正しています。

変更の背景

この変更の背景には、Go言語のWindows環境におけるセットアップの簡素化と、既存のインストーラーが抱えていた問題の解決があります。

Go言語の開発において、GOROOTはGoのインストールディレクトリを指す重要な環境変数です。これはGoのツールチェインが正しく機能するために不可欠であり、コンパイラや標準ライブラリの場所を特定するために使用されます。以前のインストーラーでは、このGOROOTが自動的に設定されていなかったため、ユーザーは手動で設定する必要がありました。これは特にGoを初めて利用するユーザーにとって、セットアップの障壁となっていました。

また、コミットメッセージに記載されているIssue #3287と#3361は、インストーラーに関連する具体的なバグや改善要求を示唆しています。これらの問題は、インストーラーの使い勝手や機能性に影響を与えていたと考えられます。

このコミットは、これらの問題を解決し、WindowsユーザーがGoをより簡単にインストールし、すぐに開発を開始できるようにすることを目的としています。

前提知識の解説

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

  • Go言語の環境変数 (GOROOT, GOPATH, PATH):

    • GOROOT: GoのSDKがインストールされているディレクトリのパスです。Go 1.8以降では、通常この変数を手動で設定する必要はありませんが、インストーラーが設定することで、古いバージョンや特定の環境での互換性を確保できます。
    • GOPATH: Goのワークスペースのルートディレクトリです。Goのソースコード、パッケージ、実行可能ファイルが配置される場所です。このコミットでは直接変更されていませんが、godocコマンドの引数に%GOPATH%が追加されていることから、GOPATHの概念が関連しています。
    • PATH: オペレーティングシステムが実行可能ファイルを探すディレクトリのリストです。Goのバイナリ(go.exeなど)がこのパスに含まれていることで、コマンドラインからGoのツールを実行できるようになります。このコミットでは、[INSTALLDIR]bin(Goのバイナリが置かれる場所)がPATHに追加されています。
  • Windows Installer XML (WiX) Toolset:

    • installer.wxsファイルは、WiX Toolsetで作成されたWindowsインストーラーパッケージのソースファイルです。WiXは、Windows Installer (MSI) パッケージを作成するためのXMLベースの言語とツールセットです。
    • WiXのXMLファイルでは、インストールのコンポーネント(ファイル、レジストリキー、ショートカットなど)、ディレクトリ構造、カスタムアクションなどを定義します。
    • ProductPackageMediaDirectoryComponentFeatureなどの要素が使用されます。
    • <?define ...?>は、XML内で使用できる変数を定義します。
    • $(var.VariableName)は、定義された変数の値を使用します。
    • Id属性は、要素の一意な識別子です。
    • Guid属性は、コンポーネントの一意な識別子であり、Windows Installerがコンポーネントのインストール状態を追跡するために使用します。
  • Windowsの環境変数設定:

    • Windowsでは、システム環境変数とユーザー環境変数があります。インストーラーは通常、これらの環境変数を設定して、インストールされたソフトウェアがシステム全体または特定のユーザーに対して利用可能になるようにします。
    • WiXでは、<Environment>要素を使用して環境変数を設定できます。Action="set"は設定、Part="last"は既存の値に追加、Nameは変数名、Valueは設定する値、Permanent="no"はアンインストール時に削除されることを意味します。
  • godocコマンド:

    • Goのドキュメンテーションサーバーを起動するコマンドです。通常、http://localhost:6060でアクセスできます。
    • -httpフラグでリスニングアドレスを指定します。
    • -gorootフラグでGOROOTのパスを指定できます。
    • -pathフラグでGOPATHのパスを指定できます。
  • Windowsコマンドプロンプト (cmd.exe):

    • startコマンドは、新しいウィンドウでプログラムやドキュメントを開くために使用されます。
    • /cは、コマンドを実行した後にコマンドプロンプトを終了します。
    • /dは、開始ディレクトリを指定します。
    • &amp;&amp;は、前のコマンドが成功した場合に次のコマンドを実行します(XMLエンティティとして記述されているため、&&となります)。
    • %VAR%は、環境変数の値を取得します。

技術的詳細

このコミットは、WiX Toolsetで記述されたWindowsインストーラーの構成ファイルであるinstaller.wxsを修正しています。

  1. GOROOT環境変数の設定:

    • 以前のバージョンではGOROOTが設定されていませんでしたが、このコミットにより、<Environment>要素が追加され、GOROOTがインストールディレクトリ([INSTALLDIR])に設定されるようになりました。これにより、Goのツールチェインが正しく機能するために必要なGOROOTが自動的に設定されます。
    • Id="GoRoot"Action="set"Part="all"Name="GOROOT"Permanent="no"System="yes"Value="[INSTALLDIR]"という属性が設定されています。Part="all"は、既存のGOROOTがあればそれを上書きし、なければ新規に設定することを意味します。System="yes"はシステム環境変数として設定することを示します。
  2. godocショートカットの改善:

    • GoDocServerStartMenuShortcutArgumentsが変更されました。
    • 変更前: '/c "start /d[INSTALLDIR]bin godoc.exe -http=:6060 &amp;&amp; start http://localhost:6060"'
    • 変更後: '/c start "Godoc Server http://localhost:6060" /d"[INSTALLDIR]bin" godoc.exe -http=:6060 -goroot="[INSTALLDIR]" -path="%GOPATH%" &amp;&amp; start http://localhost:6060'
    • 新しい引数では、godoc.exeの起動時に-goroot="[INSTALLDIR]"-path="%GOPATH%"が明示的に渡されるようになりました。これにより、godocがGoのインストールパスとワークスペースパスを正しく認識し、ドキュメントの生成と表示がより確実に行われるようになります。
    • また、startコマンドのタイトルが"Godoc Server http://localhost:6060"と設定され、より分かりやすくなっています。
  3. デスクトップショートカットの削除:

    • 以前はGoDocServerDesktopShortcutというデスクトップショートカットが作成されていましたが、このコミットで削除されました。これにより、スタートメニューからのアクセスに一本化され、デスクトップの clutter を減らすことができます。
  4. プロダクトIDとアップグレードコードの定義の変更:

    • ProdIdUpgradeCodeが、<?define ...?>を使ってアーキテクチャ(386またはx64)に応じて動的に定義されるようになりました。これにより、32ビット版と64ビット版のインストーラーで異なる識別子を持つことができ、インストールの管理がより適切に行えるようになります。
    • UpgradeCodeは、インストーラーのアップグレードパスを管理するために非常に重要です。これにより、新しいバージョンのGoがリリースされた際に、既存のインストールをスムーズにアップグレードできるようになります。
  5. LicenseAcceptedプロパティの追加:

    • <Property Id="LicenseAccepted">1</Property>が追加されました。これは、インストーラーがライセンス契約を自動的に受け入れたと見なすためのプロパティである可能性があります。これにより、サイレントインストールや自動化されたインストールが容易になる場合があります。
  6. SYSFOLDERからSysFolderへの変更:

    • <?define SYSFOLDER=SystemFolder ?><?define SysFolder=SystemFolder ?>に変更され、それに伴い参照箇所も$(var.SYSFOLDER)から$(var.SysFolder)に変更されています。これは命名規則の統一またはWiXのベストプラクティスに合わせた変更と考えられます。
  7. Win64からIsX64Targetへの変更:

    • <?define Win64=no ?><?define IsX64Target = no ?>に変更され、それに伴い参照箇所もWin64からIsX64Targetに変更されています。これも命名規則の統一またはより明確な意図を示すための変更と考えられます。
  8. GUIDの波括弧追加:

    • Component要素のGuid属性の値に波括弧({})が追加されました。例: Guid="f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b"からGuid="{f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b}"へ。これはWiXの推奨されるGUIDの記述形式に合わせた変更です。

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

変更はmisc/dist/windows/installer.wxsファイルに集中しています。

--- a/misc/dist/windows/installer.wxs
+++ b/misc/dist/windows/installer.wxs
@@ -7,11 +7,15 @@
 -->
 
 <?if $(var.Arch) = 386 ?>
-  <?define SYSFOLDER=SystemFolder ?>
-  <?define Win64=no ?>
+  <?define ProdId = {FF5B30B2-08C2-11E1-85A2-6ACA4824019B} ?>
+  <?define UpgradeCode = {1C3114EA-08C3-11E1-9095-7FCA4824019B} ?>
+  <?define SysFolder=SystemFolder ?>
+  <?define IsX64Target = no ?>
 <?else?>
-  <?define SYSFOLDER=System64Folder ?>
-  <?define Win64=yes ?>
+  <?define ProdId = {716c3eaa-9302-48d2-8e5e-5cfec5da2fab} ?>
+  <?define UpgradeCode = {22ea7650-4ac6-4001-bf29-f4b8775db1c0} ?>
+  <?define SysFolder=System64Folder ?>
+  <?define IsX64Target = yes ?>
 <?endif?>
 
 <Product
@@ -21,7 +25,7 @@
     Codepage="1252"
     Version="0.0.0.0"
     Manufacturer="http://golang.org"
-    UpgradeCode="1C3114EA-08C3-11E1-9095-7FCA4824019B" >
+    UpgradeCode="$(var.UpgradeCode)" >
     <!-- Version="$(var.Version)" TODO: Version requires X.X.X.X format -->
 
 <Package
@@ -41,12 +45,12 @@
 <Property Id="ARPHELPLINK" Value="golang.org/doc/community.html" />
 <Property Id="ARPREADME" Value="golang.org" />
 <Property Id="ARPURLINFOABOUT" Value="golang.org" />
+<Property Id="LicenseAccepted">1</Property>
 <Icon Id="gopher.ico" SourceFile="images\gopher.ico"/>
 <Property Id="ARPPRODUCTICON" Value="gopher.ico" />
 <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="C:\"/>
 
 <CustomAction
     Id="SetApplicationRootDirectory"
@@ -64,34 +68,24 @@
   <Directory Id="EnvironmentEntries">
     <Directory Id="GoEnvironmentEntries" Name="Go Programming Language"/>
   </Directory>
-  <Directory Id="DesktopFolder" Name="Desktop"/>
 </Directory>
 
-<!-- Programs Menu & Desktop Shortcuts -->
+<!-- Programs Menu Shortcuts -->
 <DirectoryRef Id="GoProgramShortcutsDir">
-  <Component Id="Component_GoShortCuts" Guid="f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b">\
+  <Component Id="Component_GoProgramShortCuts" Guid="{f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b}" Win64="$(var.IsX64Target)">\
     <Shortcut
         Id="GoDocServerStartMenuShortcut"
         Name="GoDocServer"
         Description="Starts the Go documentation server (http://localhost:6060)"
         Show="minimized"
-        Arguments='/c "start /d[INSTALLDIR]bin godoc.exe -http=:6060 &amp;&amp; start http://localhost:6060"'\
+        Arguments='/c start "Godoc Server http://localhost:6060" /d"[INSTALLDIR]bin" godoc.exe -http=:6060 -goroot="[INSTALLDIR]" -path="%GOPATH%" &amp;&amp; start http://localhost:6060'\
         Icon="gopher.ico"
         Target="[%ComSpec]" />
-    <Shortcut
-        Id="GoDocServerDesktopShortcut"
-        Directory="DesktopFolder"
-        Name="GoDocServer"
-        Description="Starts the godoc server (http://localhost:6060)"
-        Show="minimized"
-        Icon="gopher.ico"
-        Arguments='/c "start /d[INSTALLDIR]bin godoc.exe -http=:6060 &amp;&amp; start http://localhost:6060"'\
-        Target="[%ComSpec]" />
     <Shortcut
         Id="UninstallShortcut"
         Name="Uninstall Go"
         Description="Uninstalls Go and all of its components"
-        Target="[$(var.SYSFOLDER)]msiexec.exe"\
+        Target="[$(var.SysFolder)]msiexec.exe"\
         Arguments="/x [ProductCode]" />
     <RemoveFolder
         Id="GoProgramShortcutsDir"
@@ -108,7 +92,7 @@
 
 <!-- Registry & Environment Settings -->
 <DirectoryRef Id="GoEnvironmentEntries">
-  <Component Id="Component_GoEnvironment" Guid="3ec7a4d5-eb08-4de7-9312-2df392c45993">\
+  <Component Id="Component_GoEnvironment" Guid="{3ec7a4d5-eb08-4de7-9312-2df392c45993}" Win64="$(var.IsX64Target)">\
     <RegistryKey
         Root="HKCU"
         Key="Software\GoProgrammingLanguage"
@@ -124,21 +108,27 @@
                 Value="[INSTALLDIR]" />
     </RegistryKey>
     <Environment
-        Id="Environment"\
+        Id="GoPathEntry"\
         Action="set"\
         Part="last"\
         Name="PATH"\
         Permanent="no"\
         System="yes"\
         Value="[INSTALLDIR]bin" />
+    <Environment
+        Id="GoRoot"\
+        Action="set"\
+        Part="all"\
+        Name="GOROOT"\
+        Permanent="no"\
+        System="yes"\
+        Value="[INSTALLDIR]" />
     <RemoveFolder
         Id="GoEnvironmentEntries"
         On="uninstall" />
   </Component>
 </DirectoryRef>
 
-<!-- Components -->
-
 <!-- Install the files -->
 <Feature
     Id="GoTools"
@@ -146,7 +136,7 @@
     Level="1">
       <ComponentRef Id="Component_GoEnvironment" />
       <ComponentGroupRef Id="AppFiles" />
-      <ComponentRef Id="Component_GoShortCuts" />
+      <ComponentRef Id="Component_GoProgramShortCuts" />
 </Feature>
 
 <!-- Update the environment -->

コアとなるコードの解説

このコミットの最も重要な変更点は、GOROOT環境変数の設定とgodocショートカットの引数変更です。

  1. GOROOT環境変数の設定:

    • 以前のインストーラーでは、Goのインストールパスを示すGOROOT環境変数が設定されていませんでした。これは、Goのツールが正しく動作するために手動での設定が必要となる原因となっていました。
    • このコミットでは、GoEnvironmentEntriesディレクトリリファレンス内のComponent_GoEnvironmentコンポーネントに、新しい<Environment>要素が追加されました。
    • この<Environment>要素は、Name="GOROOT"としてGOROOT環境変数を定義し、そのValue[INSTALLDIR](Goがインストールされるディレクトリ)に設定します。
    • Action="set"は変数を設定することを示し、Part="all"は既存のGOROOTがあればそれを上書きし、なければ新規に設定することを意味します。System="yes"は、この環境変数がシステム全体で利用可能になるように設定されることを示します。
    • これにより、Goのインストール後すぐにgoコマンドやその他のツールがGOROOTを認識し、正しく動作するようになります。
  2. godocショートカットの引数変更:

    • GoDocServerStartMenuShortcutArguments属性が大幅に変更されました。
    • 変更前は、単にgodoc.exeを起動し、その後ブラウザでhttp://localhost:6060を開くだけでした。
    • 変更後は、godoc.exeの起動時に-goroot="[INSTALLDIR]"-path="%GOPATH%"という2つの重要なフラグが追加されました。
      • -goroot="[INSTALLDIR]": godocコマンドにGoのインストールディレクトリを明示的に伝えます。これにより、godocがGoの標準ライブラリのドキュメントを正しく見つけられるようになります。
      • -path="%GOPATH%": godocコマンドにユーザーのGOPATHを明示的に伝えます。これにより、godocがユーザーが開発しているプロジェクトのドキュメントも適切に生成・表示できるようになります。
    • これらの変更により、godocサーバーがより堅牢になり、ユーザーが期待するすべてのドキュメントを正しく提供できるようになります。

これらの変更は、GoのWindowsインストーラーの使いやすさと信頼性を大幅に向上させるものです。

関連リンク

参考にした情報源リンク