[インデックス 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:6060
localhost
を明示的に指定することで、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
)