[インデックス 12729] ファイルの概要
このコミットは、Go言語のWindowsインストーラーにおけるgodocショートカットの動作を修正するものです。具体的には、godocサーバーを起動し、ブラウザでそのインターフェースを開くためのコマンドライン引数が調整されています。
コミット
commit da7959d5dd1a230868d8eca9dbf11b4d54e8915a
Author: Andrew Gerrand <adg@golang.org>
Date: Fri Mar 23 12:44:33 2012 +1100
misc/dist: make godoc shortcut work
R=golang-dev
CC=golang-dev
https://golang.org/cl/5877062
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/da7959d5dd1a230868d8eca9dbf11b4d54e8915a
元コミット内容
misc/dist: make godoc shortcut work
このコミットは、Go言語の配布物に含まれるWindowsインストーラーにおいて、godocコマンドのショートカットが正しく機能するように修正を加えるものです。
変更の背景
Go言語には、ソースコードからドキュメントを生成し、HTTPサーバーとして提供するgodocというツールがあります。開発者はこのgodocサーバーをローカルで起動し、ブラウザを通じてGoの標準ライブラリや自身のプロジェクトのドキュメントを参照することができます。
Windows環境においてGoをインストールする際、インストーラーは通常、godocサーバーを簡単に起動するためのショートカットを提供します。しかし、このショートカットが内部的に実行するコマンドライン引数に問題があったため、正しくgodocサーバーが起動しない、あるいはブラウザが自動的に開かないという不具合が発生していました。
このコミットは、ユーザーがGoをインストールした後、期待通りにgodocショートカットを利用してドキュメントサーバーにアクセスできるようにするために行われました。
前提知識の解説
1. Go言語のgodocツール
godocはGo言語の公式ツールの一つで、Goのソースコードからドキュメントを生成し、表示するために使用されます。
- ドキュメント生成: Goのソースコード内のコメント(特にエクスポートされた識別子に付随するコメント)を解析し、HTML形式のドキュメントを生成します。
- HTTPサーバー:
godoc -http=:6060のように実行することで、ローカルのポート(例: 6060)でHTTPサーバーを起動し、ブラウザからhttp://localhost:6060にアクセスすることでドキュメントを閲覧できます。これは、Goの標準ライブラリのドキュメントだけでなく、GOPATH内のプロジェクトのドキュメントも表示できます。
2. Windows Installer XML (WiX) Toolset
installer.wxsファイルは、Windows Installer XML (WiX) Toolsetで作成されたセットアッププロジェクトのソースファイルです。
- WiX: Microsoft Windows Installer (MSI) パッケージを作成するためのオープンソースのツールセットです。XMLベースの言語を使用して、インストーラーの動作、ファイル、レジストリ、ショートカットなどを定義します。
.wxsファイル: WiXソースファイルであり、インストーラーの構造と内容を記述します。このファイルはコンパイルされ、最終的にMSIインストーラーパッケージが生成されます。
3. Windowsのコマンドプロンプト (cmd.exe) と start コマンド
Windowsのコマンドプロンプトでは、startコマンドを使用して新しいプロセスを開始したり、ファイルを開いたりすることができます。
start "タイトル" "プログラムのパス" [引数]: 指定されたプログラムを新しいウィンドウで起動します。"タイトル"は新しいウィンドウのタイトルバーに表示されます。start "タイトル" URL: 指定されたURLをデフォルトのWebブラウザで開きます。/c:cmd.exeの引数で、指定されたコマンドを実行した後にコマンドプロンプトを終了します。
4. INSTALLDIRとGOPATH
INSTALLDIR: WiXインストーラーで定義される変数で、Goがインストールされるディレクトリのパスを表します。GOPATH: Goのワークスペースのルートディレクトリを示す環境変数です。Goのソースコード、パッケージ、実行可能ファイルが配置される場所を定義します。godocはGOPATH内のプロジェクトのドキュメントも参照するため、このパスを正しく指定することが重要です。
技術的詳細
このコミットは、WiXソースファイルであるmisc/dist/windows/installer.wxs内のShortcut要素のArguments属性を変更しています。このArguments属性は、Windowsのスタートメニューやデスクトップに作成されるショートカットが実行するコマンドライン引数を定義します。
元のArgumentsは以下のようでした。
Arguments='/c start "Godoc Server http://localhost:6060" /d"[INSTALLDIR]bin" godoc.exe -http=:6060 -goroot="[INSTALLDIR]" -path="%GOPATH%" && start http://localhost:6060'
修正後のArgumentsは以下のようになります。
Arguments='/c start "Godoc Server http://localhost:6060" "[INSTALLDIR]bin\\godoc.exe" -http=localhost:6060 -goroot="[INSTALLDIR].\" && start http://localhost:6060'
主な変更点は以下の通りです。
-
godoc.exeのパス指定の修正:- 変更前:
/d"[INSTALLDIR]bin" godoc.exe- これは
startコマンドの/dオプション(開始ディレクトリを指定)とgodoc.exeを組み合わせていますが、startコマンドがプログラムのパスを正しく解釈できない可能性がありました。特に、パスにスペースが含まれる場合などに問題が生じやすいです。
- これは
- 変更後:
"[INSTALLDIR]bin\\godoc.exe"godoc.exeへの絶対パスを二重引用符で囲んで明示的に指定しています。これにより、startコマンドが実行するプログラムを正確に識別できるようになります。Windowsのパス区切り文字は\ですが、XML属性内ではエスケープのため\\と記述されています。
- 変更前:
-
-http引数のホスト指定の修正:- 変更前:
-http=:6060- これは
godocに対して、任意のインターフェース(:は0.0.0.0を意味する)でポート6060をリッスンするように指示します。
- これは
- 変更後:
-http=localhost:6060localhostを明示的に指定することで、godocサーバーがローカルホストからの接続のみを受け入れるようにします。これはセキュリティ上のベストプラクティスであり、また、特定のネットワーク設定下での潜在的な問題を回避するのに役立ちます。機能的には大きな違いはありませんが、より明確な指定となります。
- 変更前:
-
-goroot引数の修正:- 変更前:
-goroot="[INSTALLDIR]" - 変更後:
-goroot="[INSTALLDIR]."[INSTALLDIR]の後に.が追加されています。これは、godocがGOROOTを解釈する際に、インストールディレクトリの直下を指すことをより明確にするための変更と考えられます。Goのツールチェーンは、GOROOT環境変数が設定されていない場合、実行ファイルの場所からGOROOTを推測しようとしますが、明示的に指定することで確実性を高めます。
- 変更前:
-
-path="%GOPATH%"引数の削除:- 変更前:
-path="%GOPATH%" - 変更後: 削除
godocはデフォルトでGOPATH環境変数を参照してドキュメントを検索します。したがって、明示的に-path="%GOPATH%"を指定する必要はありません。この引数を削除することで、コマンドラインが簡潔になり、冗長性が排除されます。
- 変更前:
これらの変更により、godocサーバーの起動コマンドがより堅牢になり、Windows環境でのショートカットが意図通りに機能するようになりました。
コアとなるコードの変更箇所
--- a/misc/dist/windows/installer.wxs
+++ b/misc/dist/windows/installer.wxs
@@ -78,7 +78,7 @@
Name="GoDocServer"\r\n
Description="Starts the Go documentation server (http://localhost:6060)"\r\n
Show="minimized"\r\n
- Arguments='/c start "Godoc Server http://localhost:6060" /d\"[INSTALLDIR]bin\" godoc.exe -http=:6060 -goroot=\"[INSTALLDIR]\" -path=\"%GOPATH%\" && start http://localhost:6060\'\r\n
+ Arguments='/c start "Godoc Server http://localhost:6060" \"[INSTALLDIR]bin\\godoc.exe\" -http=localhost:6060 -goroot=\"[INSTALLDIR].\" && start http://localhost:6060\'\r\n
Icon=\"gopher.ico\"\r\n
Target=\"[%ComSpec]\" />\r\n
<Shortcut\r\n
コアとなるコードの解説
変更はinstaller.wxsファイル内のShortcut要素のArguments属性に集中しています。
-
Shortcut要素: Windowsインストーラーが作成するショートカットを定義します。Id: ショートカットの一意な識別子。Directory: ショートカットが作成されるディレクトリ(例: スタートメニュー、デスクトップ)。Name: ショートカットの表示名。Description: ショートカットの説明。Show: ショートカットが起動するウィンドウの初期状態(例:minimizedで最小化)。Arguments: ショートカットが実行するコマンドライン引数。Icon: ショートカットのアイコンファイル。Target: ショートカットが指す実行可能ファイル。ここでは[%ComSpec]となっており、これはWindowsのコマンドプロンプト(cmd.exe)を指します。つまり、ショートカットはcmd.exeを起動し、その引数としてArguments属性の内容を渡します。
-
Arguments属性の変更:'/c start "Godoc Server http://localhost:6060" ... && start http://localhost:6060''/c':cmd.exeに続くコマンドを実行し、その後cmd.exeを終了させます。start "Godoc Server http://localhost:6060" ...: 最初のstartコマンドはgodocサーバーを起動します。"Godoc Server http://localhost:6060": 新しいコマンドプロンプトウィンドウのタイトルです。"[INSTALLDIR]bin\\godoc.exe":godoc.exe実行可能ファイルへの絶対パスです。二重引用符で囲むことで、パスにスペースが含まれていても正しく解釈されます。-http=localhost:6060:godocサーバーがlocalhostのポート6060でリッスンするように指定します。-goroot="[INSTALLDIR].":godocがGoのルートディレクトリを正しく認識するように指定します。
&&: これはXMLエンティティで、実際のコマンドラインでは&&に展開されます。これは「論理AND」オペレーターであり、左側のコマンド(godocサーバーの起動)が成功した場合にのみ、右側のコマンドが実行されることを意味します。start http://localhost:6060: 2番目のstartコマンドは、デフォルトのWebブラウザでhttp://localhost:6060を開きます。これにより、godocサーバーが起動した後に自動的にドキュメントページが表示されます。
この変更により、Windowsインストーラーによって作成されるgodocショートカットは、cmd.exeを介してgodoc.exeを正確な引数で起動し、その後ユーザーのデフォルトブラウザでgodocのインターフェースを自動的に開くようになります。
関連リンク
- Go言語公式サイト: https://golang.org/
- GoDoc: https://pkg.go.dev/cmd/godoc
- WiX Toolset: https://wixtoolset.org/
参考にした情報源リンク
- Go言語の公式ドキュメント
- WiX Toolsetのドキュメント
- Windowsコマンドプロンプトの
startコマンドに関する情報 - Go言語の
godocツールの使用方法に関する情報 - GitHubのコミット履歴と関連するコードレビュー(
https://golang.org/cl/5877062)