[インデックス 16149] ファイルの概要
このコミットは、Go言語のディストリビューションプロセスにおけるWindows環境でのgotour
バイナリのファイル名に関する修正です。具体的には、Windows上でgotour
が正しく実行可能ファイルとして認識されるように、.exe
拡張子を明示的に追加する変更が行われています。
コミット
commit 81063812b4e6923d079dd15bdede237072d4842f
Author: Andrew Gerrand <adg@golang.org>
Date: Tue Apr 9 18:17:55 2013 +1000
dist: add .exe extension to tour.exe
Fixes #5246.
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/8558044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/81063812b4e6923d079dd15bdede237072d4842f
元コミット内容
このコミットの元のメッセージは以下の通りです。
dist: add .exe extension to tour.exe
Fixes #5246.
これは、tour.exe
という実行可能ファイルに.exe
拡張子を追加するという、ディストリビューション関連の修正であることを示しています。Fixes #5246
は、このコミットがGoのIssue 5246を解決することを示唆しています。
変更の背景
この変更の背景には、Windowsオペレーティングシステムにおける実行可能ファイルの命名規則と、Go言語のクロスコンパイルおよびディストリビューションの仕組みがあります。
Go言語の公式チュートリアルである「Go Tour」は、gotour
というコマンドラインツールとして提供されています。このツールは、Goのソースコードからビルドされ、ユーザーのシステムにインストールされます。
Windows環境では、実行可能ファイルは通常.exe
という拡張子を持ちます。しかし、Goのビルドプロセスでは、デフォルトで生成されるバイナリにはプラットフォーム固有の拡張子が付与されない場合があります。このため、Windows上でgotour
バイナリが生成された際に、.exe
拡張子が付いていないと、システムがそれを直接実行可能ファイルとして認識せず、コマンドラインからの実行が困難になるという問題が発生していました。
Issue #5246("cmd/go: go tool tour fails on windows")は、まさにこの問題、すなわちWindows環境でgo tool tour
コマンドが失敗するというバグを報告していました。このコミットは、この問題を解決するために、gotour
バイナリをWindows向けにコピーする際に、明示的に.exe
拡張子を付与するように修正するものです。
前提知識の解説
Go Tour (gotour
)
Go Tourは、Go言語の基本的な概念と構文をインタラクティブに学ぶことができる公式のチュートリアルです。通常、go tool tour
コマンドを実行することで、ローカルのWebサーバーが起動し、ブラウザを通じてチュートリアルにアクセスできます。
go tool
コマンド
go tool
コマンドは、Goツールチェインに含まれる様々な補助ツールを実行するためのコマンドです。例えば、go tool vet
はコードの静的解析を行い、go tool pprof
はプロファイリングデータ解析に用いられます。go tool tour
もこのカテゴリに属します。
クロスコンパイル
Go言語は、異なるオペレーティングシステムやアーキテクチャ向けのバイナリを、現在の環境でビルドする「クロスコンパイル」を強力にサポートしています。例えば、Linux環境でWindows向けの実行可能ファイルをビルドすることができます。この際、ターゲットOSの特性(例: 実行可能ファイルの拡張子)を考慮する必要があります。
misc/dist/bindist.go
このファイルは、Go言語の公式ディストリビューション(バイナリ配布)を構築する際のロジックを定義しているGoのソースファイルです。Goのリリースプロセスにおいて、様々なプラットフォーム向けのバイナリパッケージを作成する際に使用されます。このファイルには、各ツールやライブラリがどのようにパッケージングされ、どのパスに配置されるかといった情報が含まれています。
filepath.Join
Go言語の標準ライブラリpath/filepath
パッケージに含まれる関数で、OS固有のパス区切り文字を使用して、複数のパス要素を結合します。これにより、異なるOS環境でも正しくパスを構築できます。
Windowsにおける実行可能ファイル
Windowsでは、実行可能ファイルは通常.exe
、.com
、.bat
、.cmd
などの拡張子を持ちます。特に.exe
は最も一般的で、システムがプログラムとして認識し、直接実行するために不可欠な拡張子です。
技術的詳細
このコミットは、misc/dist/bindist.go
ファイル内のtour()
関数を変更しています。この関数は、Goディストリビューションの一部としてgotour
バイナリを準備する役割を担っています。
変更前は、gotour
バイナリのファイル名を決定する際に、Windowsの場合にのみ.exe
拡張子を追加するロジックが、gotour
という変数に直接文字列を結合する形で行われていました。
変更後は、まずext
という新しい変数を導入し、これを空文字列で初期化します。そして、runtime.GOOS == "windows"
(現在のビルドターゲットOSがWindowsであるか)をチェックし、もしWindowsであればext
変数に.exe
を設定します。
このext
変数を、filepath.Join
関数でパスを結合する際に、tour
バイナリのコピー元とコピー先のファイル名に適用しています。
具体的には、以下の2つのパスが変更されています。
-
コピー元パス:
filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour")
- 変更前は、
tour
というファイル名でバイナリを探していました。 - 変更後は、
filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext)
となり、Windowsの場合はtour.exe
を探すようになります。
- 変更前は、
-
コピー先パス:
filepath.Join(b.gopath, "bin", gotour)
- 変更前は、
gotour
という変数(Windowsの場合はgotour.exe
)をそのまま使用していました。 - 変更後は、
filepath.Join(b.gopath, "bin", "gotour"+ext)
となり、Windowsの場合はgotour.exe
としてコピーされるようになります。
- 変更前は、
この修正により、Windows環境でビルドされたgotour
バイナリは、常に正しい.exe
拡張子を持つようになり、システムによって実行可能ファイルとして正しく認識されるようになります。
コアとなるコードの変更箇所
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -423,13 +423,13 @@ func (b *Build) tour() error {
}
// Copy gotour binary to tool directory as "tour"; invoked as "go tool tour".
- gotour := "gotour"
- if runtime.GOOS == "windows" {
- gotour += ".exe"
+ ext := ""
+ if runtime.GOOS == "windows" {
+ ext = ".exe"
}
return cp(
- filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"),
- filepath.Join(b.gopath, "bin", gotour),
+ filepath.Join(b.root, "pkg", "tool", b.OS+"_"+b.Arch, "tour"+ext),
+ filepath.Join(b.gopath, "bin", "gotour"+ext),
)
}
コアとなるコードの解説
変更の中心は、tour()
関数内のgotour
バイナリのファイル名処理です。
-
gotour := "gotour"
の削除とext := ""
の追加:- 変更前は、
gotour
という変数に初期値として"gotour"
が設定されていました。 - 変更後は、
ext
という新しい変数が導入され、初期値は空文字列""
です。これは、拡張子を動的に決定するための準備です。
- 変更前は、
-
if runtime.GOOS == "windows" { ... }
ブロックの変更:- 変更前は、Windowsの場合に
gotour
変数に直接".exe"
を結合していました。 - 変更後は、Windowsの場合に
ext
変数に".exe"
を代入します。これにより、拡張子の有無がext
変数によって制御されるようになります。
- 変更前は、Windowsの場合に
-
filepath.Join
の引数変更:cp
関数(ファイルコピーを行う関数)の第一引数(コピー元パス)において、"tour"
にext
を結合するようになりました。これにより、Windowsではtour.exe
という名前のファイルがコピー元として指定されます。cp
関数の第二引数(コピー先パス)において、gotour
変数ではなく、"gotour"
にext
を結合するようになりました。これにより、Windowsではgotour.exe
という名前でファイルがコピーされます。
この変更により、Windows環境でのgotour
バイナリのコピー元とコピー先の両方で、.exe
拡張子が適切に付与されるようになり、Issue #5246で報告された問題が解決されます。
関連リンク
- Go Tour: https://go.dev/tour/
- Go Issue 5246: https://github.com/golang/go/issues/5246 (このコミットが修正したIssue)
- Go Change List 8558044: https://golang.org/cl/8558044 (Goのコードレビューシステムにおけるこの変更のページ)
参考にした情報源リンク
- Go言語の公式ドキュメント
- GitHubのGoリポジトリのIssueトラッカー
- Go言語のソースコード(特に
misc/dist/bindist.go
) path/filepath
パッケージのドキュメント- Windowsの実行可能ファイルに関する一般的な知識
- Go言語のクロスコンパイルに関する情報
go tool
コマンドに関する情報