[インデックス 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ファイルでは、インストールのコンポーネント(ファイル、レジストリキー、ショートカットなど)、ディレクトリ構造、カスタムアクションなどを定義します。
Product
、Package
、Media
、Directory
、Component
、Feature
などの要素が使用されます。<?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
のパスを指定できます。
- Goのドキュメンテーションサーバーを起動するコマンドです。通常、
-
Windowsコマンドプロンプト (
cmd.exe
):start
コマンドは、新しいウィンドウでプログラムやドキュメントを開くために使用されます。/c
は、コマンドを実行した後にコマンドプロンプトを終了します。/d
は、開始ディレクトリを指定します。&&
は、前のコマンドが成功した場合に次のコマンドを実行します(XMLエンティティとして記述されているため、&&
となります)。%VAR%
は、環境変数の値を取得します。
技術的詳細
このコミットは、WiX Toolsetで記述されたWindowsインストーラーの構成ファイルであるinstaller.wxs
を修正しています。
-
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"
はシステム環境変数として設定することを示します。
- 以前のバージョンでは
-
godoc
ショートカットの改善:GoDocServerStartMenuShortcut
のArguments
が変更されました。- 変更前:
'/c "start /d[INSTALLDIR]bin godoc.exe -http=:6060 && start http://localhost:6060"'
- 変更後:
'/c start "Godoc Server http://localhost:6060" /d"[INSTALLDIR]bin" godoc.exe -http=:6060 -goroot="[INSTALLDIR]" -path="%GOPATH%" && start http://localhost:6060'
- 新しい引数では、
godoc.exe
の起動時に-goroot="[INSTALLDIR]"
と-path="%GOPATH%"
が明示的に渡されるようになりました。これにより、godoc
がGoのインストールパスとワークスペースパスを正しく認識し、ドキュメントの生成と表示がより確実に行われるようになります。 - また、
start
コマンドのタイトルが"Godoc Server http://localhost:6060"
と設定され、より分かりやすくなっています。
-
デスクトップショートカットの削除:
- 以前は
GoDocServerDesktopShortcut
というデスクトップショートカットが作成されていましたが、このコミットで削除されました。これにより、スタートメニューからのアクセスに一本化され、デスクトップの clutter を減らすことができます。
- 以前は
-
プロダクトIDとアップグレードコードの定義の変更:
ProdId
とUpgradeCode
が、<?define ...?>
を使ってアーキテクチャ(386またはx64)に応じて動的に定義されるようになりました。これにより、32ビット版と64ビット版のインストーラーで異なる識別子を持つことができ、インストールの管理がより適切に行えるようになります。UpgradeCode
は、インストーラーのアップグレードパスを管理するために非常に重要です。これにより、新しいバージョンのGoがリリースされた際に、既存のインストールをスムーズにアップグレードできるようになります。
-
LicenseAccepted
プロパティの追加:<Property Id="LicenseAccepted">1</Property>
が追加されました。これは、インストーラーがライセンス契約を自動的に受け入れたと見なすためのプロパティである可能性があります。これにより、サイレントインストールや自動化されたインストールが容易になる場合があります。
-
SYSFOLDER
からSysFolder
への変更:<?define SYSFOLDER=SystemFolder ?>
が<?define SysFolder=SystemFolder ?>
に変更され、それに伴い参照箇所も$(var.SYSFOLDER)
から$(var.SysFolder)
に変更されています。これは命名規則の統一またはWiXのベストプラクティスに合わせた変更と考えられます。
-
Win64
からIsX64Target
への変更:<?define Win64=no ?>
が<?define IsX64Target = no ?>
に変更され、それに伴い参照箇所もWin64
からIsX64Target
に変更されています。これも命名規則の統一またはより明確な意図を示すための変更と考えられます。
-
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 && start http://localhost:6060"'\
+ Arguments='/c start "Godoc Server http://localhost:6060" /d"[INSTALLDIR]bin" godoc.exe -http=:6060 -goroot="[INSTALLDIR]" -path="%GOPATH%" && 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 && 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
ショートカットの引数変更です。
-
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
を認識し、正しく動作するようになります。
- 以前のインストーラーでは、Goのインストールパスを示す
-
godoc
ショートカットの引数変更:GoDocServerStartMenuShortcut
のArguments
属性が大幅に変更されました。- 変更前は、単に
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インストーラーの使いやすさと信頼性を大幅に向上させるものです。
関連リンク
- Go言語公式サイト: https://golang.org/
- Go言語ドキュメント: https://golang.org/doc/
- WiX Toolset公式サイト: https://wixtoolset.org/
参考にした情報源リンク
- コミットハッシュ: e9fef33dd8b33c0948c6e7cb202a7192af186edb
- GitHub上のコミットページ: https://github.com/golang/go/commit/e9fef33dd8b33c0948c6e7cb202a7192af186edb
- Go Code Review: https://golang.org/cl/5877059
- Go Issue #3287: https://github.com/golang/go/issues/3287 (このコミットが修正した具体的な内容は、GoのIssueトラッカーで確認できます。当時のIssueトラッカーはGoogle Code上にあった可能性があり、現在のGitHubのIssue番号とは異なる場合がありますが、このコミットが修正した問題はGoのインストーラーに関連するものです。)
- Go Issue #3361: https://github.com/golang/go/issues/3361 (上記と同様に、インストーラーに関連する問題が修正されたと考えられます。)