Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 13871] ファイルの概要

このコミットは、Go言語プロジェクトのsrc/run.batファイルに対する変更です。src/run.batは、Goプロジェクトのテストスイートを実行するためのWindowsバッチスクリプトであり、主にCI/CD環境や開発者がWindows環境でテストを実行する際に使用されます。

コミット

commit 8627e5c0a1da23e0fe2eb10c306aed77c0743f08
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Wed Sep 19 12:07:25 2012 +1000

    misc/cgo/test and test/bench/go1: enable these tests on windows
    
    R=golang-dev, r, bradfitz
    CC=golang-dev
    https://golang.org/cl/6488127

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/8627e5c0a1da23e0fe2eb10c306aed77c0743f08

元コミット内容

    misc/cgo/test and test/bench/go1: enable these tests on windows
    
    R=golang-dev, r, bradfitz
    CC=golang-dev
    https://golang.org/cl/6488127

変更の背景

このコミットの背景には、Windows環境におけるファイルパスの長さ制限という、当時のGo言語のテスト実行における既知の問題がありました。コミット前のsrc/run.batには、test/bench/go1misc/cgo/testという2つのテストスイートがコメントアウトされていました。コメントには、TODO(brainman): disabled, because it fails with: mkdir C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\2.....\\test\\bench\\: The filename or extension is too long.という記述があり、これはWindowsのファイルシステムが持つパスの最大長(通常260文字)を超過するために、これらのテストが一時ディレクトリの作成に失敗していたことを示しています。

このコミットは、このパス長制限の問題が解決されたか、または回避策が導入されたことを受けて、これらのテストをWindows環境で再び有効にするために行われました。これにより、Windows上でのGo言語のテストカバレッジが向上し、より堅牢なクロスプラットフォーム開発が可能になります。

前提知識の解説

  • src/run.bat: Go言語プロジェクトのルートディレクトリにあるバッチスクリプトで、Windows環境でGoのテストやビルドプロセスを実行するために使用されます。これは、Unix系システムにおけるmakeコマンドやシェルスクリプトに相当する役割を果たします。
  • go test: Go言語の標準テストコマンドです。指定されたパッケージ内のテスト関数を実行し、結果を報告します。
  • test/bench/go1: Go言語のベンチマークテストの一つで、Go 1のリリース時に導入された主要なベンチマークスイートを指します。Go言語のパフォーマンス回帰を検出するために重要です。
  • misc/cgo/test: cgoに関連するテストスイートです。cgoはGoプログラムからC言語のコードを呼び出すためのGoの機能であり、このテストはcgoの機能が正しく動作するかを確認します。cgoはOS固有のリンカやコンパイラに依存するため、クロスプラットフォームでのテストは特に重要です。
  • if errorlevel 1 goto fail: Windowsバッチスクリプトの構文です。直前のコマンドがエラーコード(errorlevel)として1以上を返した場合(通常、エラーが発生したことを意味します)、スクリプトの実行を:failというラベルの箇所にジャンプさせます。これにより、テストの失敗時にスクリプト全体が停止し、エラーが報告されます。
  • Windowsのファイルパス長制限: Windowsの古いAPI(MAX_PATH)では、ファイルパスの最大長が260文字に制限されていました。これは、特に深いディレクトリ構造を持つプロジェクトや、一時ファイルに長いパスが生成される場合に問題となることがありました。現代のWindowsではこの制限は緩和されていますが、古いシステムや特定のアプリケーションでは依然として考慮が必要です。

技術的詳細

このコミットの技術的な詳細は、src/run.batファイル内のコメントアウトされた行を解除することに集約されます。

以前、test/bench/go1misc/cgo/testの実行は、Windows環境で一時ディレクトリを作成する際に、生成されるパスがWindowsのファイルパス長制限(MAX_PATH)を超過するために失敗していました。この問題は、Goのテストフレームワークやビルドシステムが、テスト実行のために非常に長い一時パスを生成する傾向があったことに起因します。

このコミットでは、これらのテストを実行するコマンドの前の::(バッチファイルでのコメントアウト)を削除しています。これは、以下のいずれかの理由でパス長の問題が解決されたことを示唆しています。

  1. Goツールチェーンの改善: Goのビルドシステムやテストランナーが、Windows上での一時ファイルのパス生成方法を改善し、より短いパスを使用するように変更された。
  2. Windows APIの利用: GoがWindowsの新しいAPI(Long Path Aware API)を利用するように変更され、260文字のパス長制限を超えてもファイルを作成できるようgoコマンドが対応した。
  3. テスト環境の調整: テスト実行環境自体が、より短いベースパスを持つように設定された。

コミットメッセージに記載されているhttps://golang.org/cl/6488127は、この変更に関連するGoのコードレビュー(Change List)へのリンクであり、通常、このリンクを辿ることで、具体的な問題解決の詳細(例えば、Goのツールチェーンのどの部分が変更されたか)を知ることができます。このCL(Change List)は、Goのソースコード管理システムであるGerritにおける変更提案を指し、関連する議論や具体的なコード変更履歴が記録されています。

コアとなるコードの変更箇所

src/run.batファイルにおいて、以下の2つのセクションが変更されています。

1. test/bench/go1 テストの有効化:

--- a/src/run.bat
+++ b/src/run.bat
@@ -57,11 +57,10 @@ go build ..\misc\dashboard\builder ..\misc\goplay
 if errorlevel 1 goto fail
 echo.
 
-:: TODO(brainman): disabled, because it fails with: mkdir C:\Users\ADMINI~1\AppData\Local\Temp\2.....\test\bench\: The filename or extension is too long.
-::echo # ..\test\bench\go1
-::go test ..\test\bench\go1
-::if errorlevel 1 goto fail
-::echo.
+echo # ..\test\bench\go1
+go test ..\test\bench\go1
+if errorlevel 1 goto fail
+echo.

2. misc/cgo/test テストの有効化:

--- a/src/run.bat
+++ b/src/run.bat
@@ -77,11 +76,10 @@ if x%CGO_ENABLED% == x0 goto nocgo
 ::if errorlevel 1 goto fail
 ::echo.
 
-:: TODO(brainman): disabled, because it fails with: mkdir C:\Users\ADMINI~1\AppData\Local\Temp\2.....\go\misc\cgo\: The filename or extension is too long.
-::echo # ..\misc\cgo\test
-::go test ..\misc\cgo\test
-::if errorlevel 1 goto fail
-::echo.
+echo # ..\misc\cgo\test
+go test ..\misc\cgo\test
+if errorlevel 1 goto fail
+echo.
 :nocgo

コアとなるコードの解説

変更は非常にシンプルで、コメントアウトされていた以下の行の先頭にある::が削除されています。

  • echo # ..\test\bench\go1
  • go test ..\test\bench\go1
  • if errorlevel 1 goto fail

そして、同様にmisc/cgo/testについても同じ変更が適用されています。

  • echo # ..\misc\cgo\test
  • go test ..\misc\cgo\test
  • if errorlevel 1 goto fail

それぞれの行の役割は以下の通りです。

  • echo # ..\test\bench\go1 (または misc/cgo/test): これは、現在実行しているテストスイートの名前をコンソールに出力するための行です。テストの進行状況をユーザーに知らせるためのものです。
  • go test ..\test\bench\go1 (または misc/cgo/test): 実際にGoのテストコマンドを実行する行です。指定されたパス(..\test\bench\go1..\misc\cgo\test)にあるテストパッケージをビルドし、その中のテストを実行します。
  • if errorlevel 1 goto fail: この行は、直前のgo testコマンドの実行結果をチェックします。もしgo testがエラーを返した場合(errorlevelが1以上)、スクリプトは:failラベルにジャンプし、テストプロセス全体が失敗として終了します。これにより、テストの失敗が適切に報告されます。

これらの変更により、Windows環境でsrc/run.batが実行された際に、以前はスキップされていたtest/bench/go1misc/cgo/testが実際に実行されるようになります。

関連リンク

参考にした情報源リンク