[インデックス 12070] ファイルの概要
このコミットは、Go言語プロジェクトのビルドシステムに clean.bat
という新しいファイルを追加するものです。このファイルは、Windows環境においてビルドによって生成された中間ファイルや成果物をクリーンアップするためのバッチスクリプトとして機能します。GoプロジェクトのクリーンアッププロセスをWindowsユーザーにも提供し、ビルド環境を整理することを目的としています。
コミット
commit 7a4d7444f01472bb28348bf9df1b87ea1f32e9bc
Author: Alex Brainman <alex.brainman@gmail.com>
Date: Mon Feb 20 12:17:27 2012 +1100
build: implement clean.bat
Fixes #2893.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5685047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7a4d7444f01472bb28348bf9df1b87ea1f32e9bc
元コミット内容
build: implement clean.bat
Fixes #2893.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5685047
変更の背景
このコミットの主な背景は、Go言語のビルドプロセスにおいて、Windows環境でのクリーンアップ機能が不足していたことです。コミットメッセージにある Fixes #2893
は、この問題に対する修正であることを示唆しています。通常、ソフトウェア開発では、ビルドプロセス中に一時ファイル、コンパイル済みオブジェクト、実行可能ファイルなどの多くの派生ファイルが生成されます。これらのファイルは、新しいビルドを行う前に削除されるべきであり、これによりクリーンなビルド環境が保証され、古い成果物による問題が回避されます。
Unix系システムでは make clean
のようなコマンドが一般的ですが、Windows環境では同等の機能を提供するための専用のスクリプトが必要でした。clean.bat
の導入は、WindowsユーザーがGoのソースコードからビルドを行う際に、簡単にビルド成果物を削除し、クリーンな状態に戻せるようにするためのものです。これにより、開発ワークフローの効率化と、クロスプラットフォームでの開発体験の一貫性が向上します。
前提知識の解説
バッチファイル (.bat)
.bat
ファイルは、Microsoft Windowsのコマンドプロンプト(cmd.exe
)で実行されるスクリプトファイルです。一連のコマンドライン命令を記述し、自動的に実行するために使用されます。この clean.bat
も、Windows環境でGoのビルド成果物をクリーンアップするための一連のコマンドを実行します。
setlocal
setlocal
コマンドは、バッチファイル内で環境変数の変更をローカルスコープに限定するために使用されます。setlocal
が実行された後に行われた環境変数の変更は、バッチファイルの実行が終了するか、endlocal
コマンドが実行されると元に戻ります。これにより、スクリプトがシステム全体の環境設定に意図しない影響を与えることを防ぎます。
errorlevel
errorlevel
は、直前に実行されたコマンドの終了コード(リターンコード)を示す環境変数です。通常、0
は成功を意味し、非ゼロの値はエラーを示します。バッチファイルでは if errorlevel N
のように使用され、N
以上の errorlevel
であれば条件が真となります。これにより、コマンドの成功・失敗に基づいてスクリプトのフローを制御できます。
go tool dist
go tool dist
は、Goのビルドシステムの一部であり、Goのツールチェーン自体をビルド・管理するためのコマンドです。
go tool dist env -wp
: このコマンドは、Goのビルド環境変数を設定するためのバッチスクリプトを標準出力に出力します。-wp
オプションは、Windowsパス形式で出力することを意味します。この出力は通常、call
コマンドで実行され、現在のシェルセッションにGoのビルド環境変数を設定するために使用されます。go tool dist clean
: このコマンドは、go tool dist
によって生成されたビルド成果物(例えば、Goツールチェーン自体のビルドによって生成された一時ファイルや実行可能ファイル)をクリーンアップします。
go clean
go clean
コマンドは、Goのパッケージやモジュールのビルドによって生成されたオブジェクトファイル、実行可能ファイル、キャッシュなどを削除するために使用されます。
go clean -i std
:-i
オプションは、インストールされたパッケージのアーカイブファイルも削除することを意味します。std
は、標準ライブラリのパッケージを対象とすることを示します。これにより、Goの標準ライブラリのビルド成果物がクリーンアップされます。
技術的詳細
clean.bat
スクリプトは、Goのビルド環境をクリーンアップするための堅牢なプロセスを実装しています。
-
著作権表示とエコーオフ: スクリプトの冒頭には著作権表示があり、
@echo off
によってコマンドの実行結果がコンソールに表示されないように設定されています。 -
ローカル環境変数の設定:
setlocal
コマンドにより、このスクリプト内で設定される環境変数が、スクリプトの実行が終了した際に自動的に元に戻るようにします。これにより、システム全体の環境設定に影響を与えません。 -
エラーフラグの初期化:
set GOBUILDFAIL=0
は、ビルド失敗を示すフラグを初期化します。これはスクリプトの最後に終了コードとして使用されます。 -
Goビルド環境の読み込み:
go tool dist env -wp >env.bat
は、Goのビルド環境変数をenv.bat
という一時ファイルに書き出します。if errorlevel 1 goto fail
は、go tool dist env
コマンドが失敗した場合(errorlevel
が1以上の場合)、fail
ラベルにジャンプしてスクリプトを終了します。call env.bat
は、生成されたenv.bat
を実行し、現在のコマンドプロンプトセッションにGoのビルド環境変数を設定します。これにより、GOBIN
やGOTOOLDIR
などの変数が利用可能になります。del env.bat
は、一時ファイルenv.bat
を削除します。echo.
は、空行を出力します。 -
dist
ツールの存在確認:if exist %GOTOOLDIR%\\dist.exe goto distok
は、go tool dist
コマンドの実行可能ファイル(Windowsではdist.exe
)が存在するかどうかを確認します。これは、Goのビルドツールが正しくインストールされているか、またはビルド環境が適切に設定されているかを確認するための重要なステップです。echo cannot find %GOTOOLDIR%\\dist; nothing to clean
は、dist.exe
が見つからない場合にエラーメッセージを出力します。goto fail
は、dist.exe
が見つからない場合にfail
ラベルにジャンプします。:distok
は、dist.exe
が見つかった場合に処理を続行するためのラベルです。 -
クリーンアップの実行:
"%GOBIN%\\go" clean -i std
は、Goの標準ライブラリのビルド成果物をクリーンアップします。GOBIN
はGoの実行可能ファイルが置かれているディレクトリを指します。%GOTOOLDIR%\\dist clean
は、go tool dist
によって生成されたビルド成果物をクリーンアップします。 -
スクリプトの終了:
goto end
は、クリーンアップ処理が成功した場合にend
ラベルにジャンプします。 -
エラーハンドリング:
:fail
ラベルは、エラーが発生した場合にジャンプする場所です。set GOBUILDFAIL=1
は、エラーが発生したことを示すフラグを設定します。 -
終了コードの設定:
:end
ラベルは、スクリプトの最終的な終了処理を行う場所です。if x%GOBUILDEXIT%==x1 exit %GOBUILDFAIL%
は、GOBUILDEXIT
という環境変数が1
に設定されている場合(これは通常、外部からスクリプトの終了コードを制御するために使用される)、GOBUILDFAIL
の値(0または1)をスクリプトの終了コードとして設定します。これにより、スクリプトの実行結果を呼び出し元のプロセスに正確に伝えることができます。
コアとなるコードの変更箇所
--- /dev/null
+++ b/src/clean.bat
@@ -0,0 +1,30 @@
+:: Copyright 2012 The Go Authors. All rights reserved.
+:: Use of this source code is governed by a BSD-style
+:: license that can be found in the LICENSE file.
+@echo off
+
+setlocal
+
+set GOBUILDFAIL=0
+
+go tool dist env -wp >env.bat
+if errorlevel 1 goto fail
+call env.bat
+del env.bat
+echo.
+
+if exist %GOTOOLDIR%\\dist.exe goto distok
+echo cannot find %GOTOOLDIR%\\dist; nothing to clean
+goto fail
+:distok
+
+"%GOBIN%\\go" clean -i std
+%GOTOOLDIR%\\dist clean
+
+goto end
+
+:fail
+set GOBUILDFAIL=1
+
+:end
+if x%GOBUILDEXIT%==x1 exit %GOBUILDFAIL%
コアとなるコードの解説
src/clean.bat
ファイルは新規作成されており、以下の30行のコードで構成されています。
-
:: Copyright 2012 The Go Authors. All rights reserved.
:: Use of this source code is governed by a BSD-style
:: license that can be found in the LICENSE file.
Goプロジェクトの標準的な著作権表示とライセンス情報です。::
はバッチファイルにおけるコメント行を示します。 -
@echo off
このコマンドは、スクリプトが実行される際に、各コマンド自体がコンソールに表示されるのを防ぎます。これにより、出力がクリーンになります。 -
setlocal
このコマンドは、このスクリプト内で設定される環境変数が、スクリプトの実行が終了した際に自動的に元に戻るようにします。これにより、スクリプトがシステム全体の環境設定に影響を与えることを防ぎます。 -
set GOBUILDFAIL=0
GOBUILDFAIL
という環境変数を0
に初期化します。これは、スクリプトの実行中にエラーが発生したかどうかを示すフラグとして使用されます。0
は成功、1
は失敗を示します。 -
go tool dist env -wp >env.bat
go tool dist env -wp
コマンドを実行し、その出力をenv.bat
というファイルにリダイレクトします。このコマンドは、Goのビルドに必要な環境変数(例:GOBIN
,GOTOOLDIR
)を設定するためのバッチコマンドを生成します。-wp
オプションは、Windowsパス形式で出力することを指定します。 -
if errorlevel 1 goto fail
直前のコマンド(go tool dist env -wp
)の終了コードが1
以上(つまりエラー)であれば、スクリプトの実行を:fail
ラベルにジャンプさせます。 -
call env.bat
生成されたenv.bat
ファイルを実行します。これにより、go tool dist env
によって設定されたGoのビルド環境変数が現在のコマンドプロンプトセッションに適用され、後続のGoコマンドが正しく動作するようになります。 -
del env.bat
一時的に作成したenv.bat
ファイルを削除します。 -
echo.
コンソールに空行を出力し、視覚的な区切りを提供します。 -
if exist %GOTOOLDIR%\\dist.exe goto distok
%GOTOOLDIR%
環境変数で指定されたディレクトリ内にdist.exe
というファイルが存在するかどうかを確認します。dist.exe
はGoのビルドツールの一部です。存在すれば、スクリプトの実行を:distok
ラベルにジャンプさせます。 -
echo cannot find %GOTOOLDIR%\\dist; nothing to clean
dist.exe
が見つからない場合に、エラーメッセージをコンソールに出力します。 -
goto fail
dist.exe
が見つからなかった場合、スクリプトの実行を:fail
ラベルにジャンプさせます。 -
:distok
dist.exe
が見つかった場合に、ここから処理を続行します。 -
"%GOBIN%\\go" clean -i std
%GOBIN%
環境変数で指定されたGoの実行可能ファイル(go.exe
)を使用して、go clean -i std
コマンドを実行します。このコマンドは、Goの標準ライブラリのビルドによって生成された中間ファイルやキャッシュを削除します。-i
オプションは、インストールされたパッケージのアーカイブファイルも削除することを意味します。 -
%GOTOOLDIR%\\dist clean
%GOTOOLDIR%
環境変数で指定されたdist
ツールを使用して、clean
コマンドを実行します。これは、go tool dist
によって生成されたビルド成果物(Goツールチェーン自体のビルドによって生成されたファイルなど)をクリーンアップします。 -
goto end
クリーンアップ処理が成功した場合、スクリプトの実行を:end
ラベルにジャンプさせます。 -
:fail
エラーが発生した場合にジャンプするラベルです。 -
set GOBUILDFAIL=1
GOBUILDFAIL
環境変数を1
に設定し、エラーが発生したことを示します。 -
:end
スクリプトの最終的な終了処理を行うラベルです。 -
if x%GOBUILDEXIT%==x1 exit %GOBUILDFAIL%
GOBUILDEXIT
という環境変数が1
に設定されている場合(これは通常、外部からスクリプトの終了コードを制御するために使用される)、GOBUILDFAIL
の値(0または1)をスクリプトの終了コードとして設定します。これにより、スクリプトの実行結果を呼び出し元のプロセスに正確に伝えることができます。
関連リンク
- Go CL 5685047: https://golang.org/cl/5685047
参考にした情報源リンク
- Go Command
go clean
: https://pkg.go.dev/cmd/go#hdr-Remove_object_files_and_cached_files - Go Command
go tool dist
: https://pkg.go.dev/cmd/go#hdr-Build_Go_toolchain (このドキュメントにはdist
サブコマンドの詳細な説明は少ないですが、go tool
の一部として言及されています。) - Microsoft Docs -
setlocal
: https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/setlocal - Microsoft Docs -
errorlevel
: https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/if (if errorlevel
の説明を含む) - Batch file basics: https://www.computerhope.com/batch.htm