[インデックス 12749] ファイルの概要
このコミットは、Go言語プロジェクトのsrc/run.bash
スクリプトに、Goのコードウォーク(codewalks)をコンパイルする機能を追加するものです。具体的には、../doc/codewalk
ディレクトリにあるpig.go
とurlpoll.go
という2つのGoプログラムをビルドし、その後生成された実行ファイルを削除する処理が追加されています。
コミット
- コミットハッシュ:
6492cac6dd3995535bd7ddd7ab11ca5047967ada
- 作者: Rob Pike r@golang.org
- コミット日時: Mon Mar 26 16:08:21 2012 +1100
- コミットメッセージ:
run.bash: compile the codewalks They could be tested but that requires more than seems wise right now. Update #2648. R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/5908054
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6492cac6dd3995535bd7ddd7ab11ca5047967ada
元コミット内容
このコミットは、src/run.bash
スクリプトに以下の変更を加えるものです。
../doc/codewalk
ディレクトリに移動します。pig.go
をgo build
コマンドでコンパイルします。urlpoll.go
をgo build
コマンドでコンパイルします。- コンパイル後に生成された実行ファイル(
pig
とurlpoll
)を削除します。 - これらの操作のいずれかが失敗した場合、スクリプトの実行を停止します。
コミットメッセージには、「これらはテストすることもできるが、現時点では賢明とは思えない」というコメントがあり、将来的にこれらのコードウォークのテストが検討される可能性を示唆しています。また、「Update #2648」という記述があり、これはGoプロジェクトの特定のイシュー(課題)に関連する変更であることを示しています。
変更の背景
この変更の背景には、Go言語の公式ドキュメントの一部である「コードウォーク(codewalks)」の整合性と機能性を確保する目的があります。コードウォークは、Go言語の特定の機能や概念をインタラクティブに学ぶためのチュートリアル形式のプログラムです。これらはGoのソースコードとして提供され、ユーザーが実際にコードを実行しながら学習を進めることができます。
コミットメッセージにある「Update #2648」は、Goプロジェクトのイシュートラッカーにおける特定の課題を指しています。当時のGoプロジェクトのイシュートラッカーはGoogle Code上に存在しており、イシュー2648は「go.googlecode.com/hg/doc/codewalk
のビルドとテスト」に関するものでした。このイシューは、コードウォークが正しくビルドできることを確認し、可能であればテストも行うことを目的としていました。
このコミットは、そのイシューに対する部分的な解決策として、少なくともコードウォークがコンパイル可能であることをrun.bash
スクリプトに組み込むことで、ビルドプロセスの健全性を保証しようとしています。テストがすぐには導入されなかったのは、当時の開発状況やリソースの制約によるものと考えられます。しかし、コンパイルの成功を確認することは、コードウォークが配布可能な状態であることを保証する上で重要なステップでした。
前提知識の解説
Go言語 (Golang)
Goは、Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型言語であり、並行処理のサポート、ガベージコレクション、高速なコンパイルが特徴です。システムプログラミング、Webサービス、ネットワークプログラミングなどで広く利用されています。
Goコマンド (go build
, go run
など)
Go言語には、ソースコードのビルド、実行、テスト、フォーマットなどを行うための標準ツールチェインが付属しています。go
コマンドはその中心となるツールです。
go build
: Goのソースファイルをコンパイルし、実行可能バイナリを生成します。デフォルトでは、カレントディレクトリに実行ファイルが作成されます。go run
: Goのソースファイルをコンパイルし、すぐに実行します。一時的な実行ファイルを生成し、実行後に削除します。go test
: Goのテストを実行します。
コードウォーク (Codewalks)
Go言語のコードウォークは、Goの公式ウェブサイト(go.dev/doc/codewalk
)で提供されているインタラクティブなチュートリアルです。これらはGoのソースコードと、そのコードを解説するテキストが組み合わさった形式で提供されます。ユーザーはブラウザ上でコードを実行し、その結果を確認しながらGoの概念を学ぶことができます。これらのコードウォークは、Goのソースツリー内のdoc/codewalk
ディレクトリに格納されています。
Bashスクリプト
Bash (Bourne-Again SHell) は、Unix系オペレーティングシステムで広く使われているシェルプログラムです。run.bash
のようなファイルは、Bashスクリプトであり、一連のコマンドを自動的に実行するために使用されます。Goプロジェクトでは、ビルド、テスト、デプロイなどの自動化されたタスクにBashスクリプトが頻繁に利用されます。
|| exit $?
Bashスクリプトにおける一般的なイディオムです。
||
: 論理OR演算子です。前のコマンドが失敗した場合(終了ステータスが0以外の場合)にのみ、次のコマンドを実行します。exit $?
: 直前のコマンドの終了ステータス($?
)でスクリプトを終了します。これにより、前のコマンドが失敗した場合にスクリプト全体の実行が停止し、エラーが伝播されます。
技術的詳細
このコミットは、Goプロジェクトのビルドおよびテストインフラストラクチャの一部であるrun.bash
スクリプトに、コードウォークのコンパイルステップを追加することで、プロジェクトの健全性を向上させています。
run.bash
スクリプトは、Goプロジェクトの様々なコンポーネントをビルドし、テストを実行するための主要なスクリプトです。このスクリプトにコードウォークのコンパイルを追加することで、以下の利点が得られます。
- ビルドの健全性チェック: コードウォークのソースコードがGoの最新の変更と互換性があることを、定期的なビルドプロセスの一部として確認できます。これにより、Go言語自体の変更がコードウォークを壊すことを早期に発見できます。
- 配布物の品質保証: コードウォークがユーザーに提供される前に、それらが正しくコンパイルできることを保証します。これにより、ユーザーがコードウォークをダウンロードして実行しようとした際に、コンパイルエラーに遭遇するリスクを減らします。
- 開発者の負担軽減: コードウォークのコンパイルを手動で確認する手間を省き、開発者がGo言語のコア開発に集中できるようにします。
追加されたコードは、go build
コマンドを使用してpig.go
とurlpoll.go
をコンパイルしています。これらのファイルは、それぞれGoのコードウォークの例として提供されているプログラムです。pig.go
は、おそらく「Pig Latin」変換を行うプログラムであり、urlpoll.go
はURLをポーリングするプログラムであると推測されます。
コンパイル後に生成された実行ファイル(pig
とurlpoll
)をrm -f
コマンドで削除しているのは、これらの実行ファイルがビルドプロセスの一部としてのみ必要であり、永続的に保存する必要がないためです。これは、ビルド成果物によるディスクスペースの消費を抑え、クリーンなビルド環境を維持するための一般的なプラクティスです。
|| exit $?
の利用は、堅牢なスクリプト作成のベストプラクティスに従っています。これにより、コードウォークのコンパイルが失敗した場合、スクリプト全体がエラーを報告して終了し、後続の依存するビルドやテストステップが不完全な状態で実行されることを防ぎます。
コアとなるコードの変更箇所
--- a/src/run.bash
+++ b/src/run.bash
@@ -74,6 +74,13 @@ make clean
./test.bash
) || exit $?\n
+(xcd ../doc/codewalk
+# TODO: test these too.
+go build pig.go
+go build urlpoll.go
+rm -f pig urlpoll
+) || exit $?\n
+echo
echo '#\' ../misc/dashboard/builder ../misc/goplay
go build ../misc/dashboard/builder ../misc/goplay
コアとなるコードの解説
変更はsrc/run.bash
ファイルの74行目以降に追加されています。
-
xcd ../doc/codewalk
:xcd
は、Goプロジェクトのrun.bash
スクリプト内で定義されているカスタム関数で、cd
コマンドと同様にディレクトリを移動しますが、移動が失敗した場合にはエラーを報告してスクリプトを終了します。- この行は、Goのコードウォークが格納されている
../doc/codewalk
ディレクトリに移動しています。これは、go build
コマンドがカレントディレクトリのソースファイルを処理するため、適切なディレクトリに移動する必要があるためです。
-
# TODO: test these too.
- これは開発者向けのコメントで、将来的にこれらのコードウォークもテスト対象に含めるべきであるという意図を示しています。コミットメッセージにも同様の記述がありました。
-
go build pig.go
pig.go
というGoソースファイルをコンパイルします。これにより、カレントディレクトリ(この場合は../doc/codewalk
)にpig
という実行可能ファイルが生成されます。
-
go build urlpoll.go
urlpoll.go
というGoソースファイルをコンパイルします。これにより、カレントディレクトリにurlpoll
という実行可能ファイルが生成されます。
-
rm -f pig urlpoll
rm -f
コマンドは、指定されたファイルを強制的に削除します。- この行は、コンパイルによって生成された
pig
とurlpoll
という実行ファイルを削除しています。これは、これらのファイルがビルドプロセスの一時的な成果物であり、永続的に保持する必要がないためです。
-
) || exit $?
- 上記の
xcd
からrm -f
までのコマンド群は、括弧()
で囲まれてサブシェルで実行されています。 - このサブシェル全体の実行が失敗した場合(つまり、
xcd
、go build
、rm -f
のいずれかのコマンドが非ゼロの終了ステータスを返した場合)、|| exit $?
によってスクリプト全体が直前のコマンドの終了ステータスで終了します。これにより、ビルドプロセスにおけるエラーが確実に捕捉され、後続の処理が中断されます。
- 上記の
この変更により、Goプロジェクトのビルドシステムは、コードウォークのコンパイルが成功することを保証するようになりました。
関連リンク
- Go言語公式サイト: https://go.dev/
- Go言語のコードウォーク: https://go.dev/doc/codewalk/
- Goプロジェクトのイシュートラッカー (Google Codeアーカイブ): 2012年当時のイシュートラッカーはGoogle Code上にありましたが、現在はアーカイブされています。直接的なリンクは提供できませんが、当時のイシューはhttps://code.google.com/p/go/issues/detail?id=2648のような形式でした。
参考にした情報源リンク
- GitHubコミットページ: https://github.com/golang/go/commit/6492cac6dd3995535bd7ddd7ab11ca5047967ada
- Go言語の公式ドキュメント:
go build
コマンドやGoのツールチェインに関する一般的な情報。 - Bashスクリプトのドキュメント:
||
演算子やexit
コマンドに関する一般的な情報。 - Goプロジェクトのソースコード:
src/run.bash
ファイルの内容と、xcd
のようなカスタム関数の定義。 - Goプロジェクトのイシュートラッカーのアーカイブ: イシュー2648に関する情報(直接アクセスは困難な場合がある)。