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

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

このコミットは、Go言語プロジェクトのsrc/run.bashスクリプトに、Goのコードウォーク(codewalks)をコンパイルする機能を追加するものです。具体的には、../doc/codewalkディレクトリにあるpig.gourlpoll.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スクリプトに以下の変更を加えるものです。

  1. ../doc/codewalkディレクトリに移動します。
  2. pig.gogo buildコマンドでコンパイルします。
  3. urlpoll.gogo buildコマンドでコンパイルします。
  4. コンパイル後に生成された実行ファイル(pigurlpoll)を削除します。
  5. これらの操作のいずれかが失敗した場合、スクリプトの実行を停止します。

コミットメッセージには、「これらはテストすることもできるが、現時点では賢明とは思えない」というコメントがあり、将来的にこれらのコードウォークのテストが検討される可能性を示唆しています。また、「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プロジェクトの様々なコンポーネントをビルドし、テストを実行するための主要なスクリプトです。このスクリプトにコードウォークのコンパイルを追加することで、以下の利点が得られます。

  1. ビルドの健全性チェック: コードウォークのソースコードがGoの最新の変更と互換性があることを、定期的なビルドプロセスの一部として確認できます。これにより、Go言語自体の変更がコードウォークを壊すことを早期に発見できます。
  2. 配布物の品質保証: コードウォークがユーザーに提供される前に、それらが正しくコンパイルできることを保証します。これにより、ユーザーがコードウォークをダウンロードして実行しようとした際に、コンパイルエラーに遭遇するリスクを減らします。
  3. 開発者の負担軽減: コードウォークのコンパイルを手動で確認する手間を省き、開発者がGo言語のコア開発に集中できるようにします。

追加されたコードは、go buildコマンドを使用してpig.gourlpoll.goをコンパイルしています。これらのファイルは、それぞれGoのコードウォークの例として提供されているプログラムです。pig.goは、おそらく「Pig Latin」変換を行うプログラムであり、urlpoll.goはURLをポーリングするプログラムであると推測されます。

コンパイル後に生成された実行ファイル(pigurlpoll)を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行目以降に追加されています。

  1. xcd ../doc/codewalk:

    • xcdは、Goプロジェクトのrun.bashスクリプト内で定義されているカスタム関数で、cdコマンドと同様にディレクトリを移動しますが、移動が失敗した場合にはエラーを報告してスクリプトを終了します。
    • この行は、Goのコードウォークが格納されている../doc/codewalkディレクトリに移動しています。これは、go buildコマンドがカレントディレクトリのソースファイルを処理するため、適切なディレクトリに移動する必要があるためです。
  2. # TODO: test these too.

    • これは開発者向けのコメントで、将来的にこれらのコードウォークもテスト対象に含めるべきであるという意図を示しています。コミットメッセージにも同様の記述がありました。
  3. go build pig.go

    • pig.goというGoソースファイルをコンパイルします。これにより、カレントディレクトリ(この場合は../doc/codewalk)にpigという実行可能ファイルが生成されます。
  4. go build urlpoll.go

    • urlpoll.goというGoソースファイルをコンパイルします。これにより、カレントディレクトリにurlpollという実行可能ファイルが生成されます。
  5. rm -f pig urlpoll

    • rm -fコマンドは、指定されたファイルを強制的に削除します。
    • この行は、コンパイルによって生成されたpigurlpollという実行ファイルを削除しています。これは、これらのファイルがビルドプロセスの一時的な成果物であり、永続的に保持する必要がないためです。
  6. ) || exit $?

    • 上記のxcdからrm -fまでのコマンド群は、括弧()で囲まれてサブシェルで実行されています。
    • このサブシェル全体の実行が失敗した場合(つまり、xcdgo buildrm -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に関する情報(直接アクセスは困難な場合がある)。