[インデックス 10291] ファイルの概要
このコミットは、Go言語のGo 1リリースに向けた大規模なパッケージ名変更とディレクトリ構造の再編成に対応するために、手動で編集されたファイル群をまとめたものです。主にMakefile
のTARG
変数の更新と、パッケージ名が変更された2つのパッケージ(html/template
とmath/cmplx
)のコード修正が含まれています。
コミット
commit 6ab6c49fce6968f200ad5381cb9348e159e51099
Author: Rob Pike <r@golang.org>
Date: Tue Nov 8 15:38:47 2011 -0800
renaming_1: hand-edited files for go 1 renaming
This contains the files that required handiwork, mostly
Makefiles with updated TARGs, plus the two packages
with modified package names.
html/template/doc.go needs a separate edit pass.
test/fixedbugs/bug358.go is not legal go so gofix fails on it.
R=rsc
CC=golang-dev
https://golang.org/cl/5340050
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/6ab6c49fce6968f200ad5381cb9348e159e51099
元コミット内容
renaming_1: hand-edited files for go 1 renaming
This contains the files that required handiwork, mostly
Makefiles with updated TARGs, plus the two packages
with modified package names.
html/template/doc.go needs a separate edit pass.
test/fixedbugs/bug358.go is not legal go so gofix fails on it.
R=rsc
CC=golang-dev
https://golang.org/cl/5340050
変更の背景
このコミットは、Go言語がバージョン1.0(Go 1)をリリースする準備の一環として行われた、大規模なパッケージ名の変更と標準ライブラリの再編成に対応するためのものです。Go 1の目標の一つは、言語と標準ライブラリの安定性を確立し、将来のバージョンとの後方互換性を保証することでした。
Go 1以前のGo言語は、まだ活発な開発段階にあり、APIの変更やパッケージ構造の変更が頻繁に行われていました。Go 1のリリースにあたり、これらの変更を安定させ、開発者が既存のコードを新しいAPIに移行しやすくするために、gofix
という自動コード修正ツールが導入されました。
しかし、gofix
ツールはすべての変更を自動的に処理できるわけではありませんでした。特に、Makefile
のようなビルド関連のファイルや、特定のパッケージ名変更(例: cmath
からcmplx
、exp/template/html
からhtml/template
)に伴うコード内のpackage
宣言の変更、そしてimport
パスの変更など、手動での介入が必要な箇所が存在しました。
このコミットは、gofix
では対応しきれなかった、または手動での確認・修正が必要とされたファイル群をまとめたものです。具体的には、Makefile
内のターゲット名(TARG
)の更新や、html/template
およびmath/cmplx
パッケージ内のpackage
宣言とimport
パスの修正が含まれています。コミットメッセージにある「html/template/doc.go
needs a separate edit pass」や「test/fixedbugs/bug358.go
is not legal go so gofix fails on it」という記述は、gofix
の限界と、手動での追加作業の必要性を示しています。
前提知識の解説
Go 1の互換性保証 (Go 1 Compatibility Promise)
Go 1は、Go言語の歴史において非常に重要なマイルストーンでした。このリリース以降、Goチームは「Go 1 Compatibility Promise」と呼ばれる厳格な後方互換性ポリシーを導入しました。これは、Go 1でリリースされたAPIは、Go 1.xの将来のすべてのリリースで互換性が維持されることを意味します。これにより、開発者はGoの新しいバージョンに安心してアップグレードできるようになり、既存のコードが動作しなくなる心配が大幅に軽減されました。このコミットで行われたパッケージ名の変更や再編成は、この安定した基盤を築くための初期段階の作業でした。
gofix
ツール
gofix
は、Go 1への移行を支援するために開発されたコマンドラインツールです。Go 1で導入された破壊的変更(関数名の変更、シグネチャの変更、パッケージの移動など)に対して、既存のGoコードを自動的に書き換える機能を提供しました。これにより、開発者は手動で大量のコードを修正する手間を省き、スムーズにGo 1へ移行することができました。
例えば、Go 1ではhttp
パッケージがnet/http
に移動されました。gofix
は、コード内のimport "http"
をimport "net/http"
に自動的に書き換えることができました。しかし、Makefile
のようなGo言語のコードではないファイルや、package
宣言のような特定のGo言語の構文変更には対応できない場合がありました。
Goのパッケージ構造とMakefile
Go言語では、コードはパッケージにまとめられ、ファイルシステム上のディレクトリ構造がパッケージパスに対応します。例えば、src/pkg/net/http
ディレクトリにあるコードはnet/http
パッケージとしてインポートされます。
Goのビルドシステムでは、各パッケージのディレクトリにMakefile
が配置され、そのパッケージのビルド方法が定義されていました。このMakefile
には、ビルドターゲットの名前を定義するTARG
変数が含まれていました。Go 1でのパッケージ名の変更や移動に伴い、これらのMakefile
内のTARG
変数も新しいパッケージ名に合わせて更新する必要がありました。
技術的詳細
このコミットで行われた変更は、主に以下の3つのカテゴリに分類できます。
-
Makefile
のTARG
変数の更新: Go 1でのパッケージ名の変更に伴い、多くのパッケージのMakefile
内のTARG
変数が更新されました。例えば、src/pkg/encoding/asn1/Makefile
ではTARG=asn1
からTARG=encoding/asn1
に変更されています。これは、パッケージのフルパスを反映するように変更されたことを意味します。同様に、src/pkg/html/template/Makefile
ではTARG=exp/template/html
からTARG=html/template
に変更されており、これはパッケージ自体の名前が変更されたことを示しています。 -
Goソースコード内の
package
宣言の変更: 一部のパッケージでは、そのパッケージが属するディレクトリ構造の変更に合わせて、Goソースコード内のpackage
宣言自体が変更されました。最も顕著な例はsrc/pkg/html/template
とsrc/pkg/math/cmplx
です。src/pkg/html/template
内のファイル(例:attr.go
,clone.go
など)では、package html
がpackage template
に変更されています。これは、exp/template/html
という実験的なパッケージがhtml/template
という正式なパッケージに昇格し、そのパッケージ名がtemplate
になったことを反映しています。src/pkg/math/cmplx
内のファイル(例:abs.go
,asin.go
など)では、package cmath
がpackage cmplx
に変更されています。これは、Go 1で複素数演算パッケージの名前がcmath
からcmplx
に変更されたためです。
-
Goソースコード内の
import
パスの変更: パッケージ名の変更や移動に伴い、それらのパッケージをインポートしている他のGoソースコードのimport
パスも更新されました。doc/effective_go.html
やdoc/effective_go.tmpl
では、import "http"
がimport "net/http"
に変更されています。これは、http
パッケージがnet
パッケージのサブパッケージとして再編成されたためです。src/pkg/html/template
内のファイルでは、template/parse
がtext/template/parse
に、template
がtext/template
に、utf8
がunicode/utf8
にそれぞれ変更されています。これは、Go 1でこれらのパッケージがより論理的な階層構造に再編成された結果です。
-
src/pkg/deps.bash
からの古いパッケージ名マッピングの削除:src/pkg/deps.bash
は、Goのビルドシステムの一部として、パッケージの依存関係を解決するために使用されていたスクリプトです。このファイルには、Go 1でのパッケージ名変更に対応するための古いパッケージ名から新しいパッケージ名へのマッピングが一時的に含まれていました。このコミットでは、これらのマッピングが不要になったため、deps.bash
から削除されています。これは、Go 1への移行が進行し、古いパッケージ名への参照が減少したことを示唆しています。
コアとなるコードの変更箇所
このコミットは広範囲にわたるファイルに影響を与えていますが、特に重要な変更箇所は以下の通りです。
-
doc/effective_go.html
およびdoc/effective_go.tmpl
:--- a/doc/effective_go.html +++ b/doc/effective_go.html @@ -1996,7 +1996,7 @@ func (ctr *Counter) ServeHTTP(w http.ResponseWriter, req *http.Request) { <code>http.ResponseWriter</code>.) For reference, here's how to attach such a server to a node on the URL tree. <pre> -import "http" +import "net/http" ... ctr := new(Counter) http.Handle("/counter", ctr) @@ -2925,12 +2925,13 @@ An explanation follows. import ( "flag" - "http" "log" - "template" + "net/http" + "text/template" ) -var addr = flag.String("addr", ":1718", "http service address") // Q=17, R=18 +var // Q=17, R=18 +addr = flag.String("addr", ":1718", "http service address") var templ = template.Must(template.New("qr").Parse(templateStr))
http
パッケージがnet/http
に、template
パッケージがtext/template
にそれぞれ変更されています。これは、Go 1での標準ライブラリの再編成を反映しています。 -
src/pkg/deps.bash
:--- a/src/pkg/deps.bash +++ b/src/pkg/deps.bash @@ -23,36 +23,6 @@ dirpat=$(echo $dirs C | awk '{\n \t}\n }') -# Append old names of renamed packages. TODO: clean up after renaming. -dirpat="$dirpat\n -/^(asn1)$/\n -/^(big)$/\n -/^(cmath)$/\n -/^(csv)$/\n -/^(exec)$/\n -/^(exp\\/template\\/html)$/\n -/^(gob)$/\n -/^(http)/\n -/^(http\\/cgi)$/\n -/^(http\\/fcgi)$/\n -/^(http\\/httptest)$/\n -/^(http\\/pprof)$/\n -/^(json)$/\n -/^(mail)$/\n -/^(rand)$/\n -/^(rpc)$/\n -/^(scanner)$/\n -/^(smtp)$/\n -/^(syslog)$/\n -/^(tabwriter)$/\n -/^(url)$/\n -/^(template)$/\n -/^(template\\/parse)$/\n -/^(utf16)$/\n -/^(utf8)$/\n -/^(xml)$/\n -" - for dir in $dirs; do (\n cd $dir >/dev/null || exit 1\n @@ -69,35 +39,6 @@ for dir in $dirs; do (\n \t\tawk "$dirpat" |\n \t\tgrep -v "^$dir\\$" |\n \t\tsed 's/$/.install/' |\n -\t\t# TODO: rename the dependencies for renamed directories. TODO: clean up after renaming.\n -\t\tsed 's;^asn1.install$;encoding/asn1.install;\n -\t\ts;^big.install$;math/big.install;\n -\t\ts;^cmath.install$;math/cmplx.install;\n -\t\ts;^csv.install$;encoding/csv.install;\n -\t\ts;^exec.install$;os/exec.install;\n -\t\ts;^exp/template/html.install$;html/template.install;\n -\t\ts;^gob.install$;encoding/gob.install;\n -\t\ts;^http.install$;net/http.install;\n -\t\ts;^http/cgi.install$;net/http/cgi.install;\n -\t\ts;^http/fcgi.install$;net/http/fcgi.install;\n -\t\ts;^http/httptest.install$;net/http/httptest.install;\n -\t\ts;^http/pprof.install$;net/http/pprof.install;\n -\t\ts;^json.install$;encoding/json.install;\n -\t\ts;^mail.install$;net/mail.install;\n -\t\ts;^rpc.install$;net/rpc.install;\n -\t\ts;^rpc/jsonrpc.install$;net/rpc/jsonrpc.install;\n -\t\ts;^scanner.install$;text/scanner.install;\n -\t\ts;^smtp.install$;net/smtp.install;\n -\t\ts;^syslog.install$;log/syslog.install;\n -\t\ts;^tabwriter.install$;text/tabwriter.install;\n -\t\ts;^template.install$;text/template.install;\n -\t\ts;^template/parse.install$;text/template/parse.install;\n -\t\ts;^rand.install$;math/rand.install;\n -\t\ts;^url.install$;net/url.install;\n -\t\ts;^utf16.install$;unicode/utf16.install;\n -\t\ts;^utf8.install$;unicode/utf8.install;\n -\t\ts;^xml.install$;encoding/xml.install;' |\n -\t\t# TODO: end of renamings.\n \t\tsed 's;^C\\.install;runtime/cgo.install;' |\n \t\tsort -u\n \t)\n
古いパッケージ名から新しいパッケージ名へのマッピングを削除しています。これは、Go 1への移行が進み、これらのマッピングが不要になったことを示しています。
-
src/pkg/html/template/attr.go
(および他のhtml/template
内のGoファイル):--- a/src/pkg/html/template/attr.go +++ b/src/pkg/html/template/attr.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package html +package template import ( "strings"
package html
がpackage template
に変更されています。これは、html/template
パッケージの内部的なパッケージ名が変更されたことを示します。 -
src/pkg/math/cmplx/abs.go
(および他のmath/cmplx
内のGoファイル):--- a/src/pkg/math/cmplx/abs.go +++ b/src/pkg/math/cmplx/abs.go @@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package cmath provides basic constants and mathematical functions for +// Package cmplx provides basic constants and mathematical functions for // complex numbers. -package cmath +package cmplx import "math"
package cmath
がpackage cmplx
に変更されています。これは、複素数演算パッケージの名前が変更されたことを示します。また、コメントも更新されています。
コアとなるコードの解説
import
パスの変更 (doc/effective_go.html
など)
import "http"
からimport "net/http"
への変更は、Go 1における標準ライブラリの再編成の典型例です。Go 1では、ネットワーク関連のパッケージがnet
ディレクトリの下に集約され、より論理的な構造になりました。これにより、開発者は関連する機能を見つけやすくなり、パッケージ間の依存関係も明確になりました。同様に、template
からtext/template
への変更も、テンプレート関連のパッケージがtext
ディレクトリの下に移動し、HTMLテンプレートと区別されるようになったことを示しています。これらの変更は、gofix
ツールによって自動的に処理されることが期待されましたが、ドキュメントファイル内のコードスニペットなど、手動での修正が必要なケースも存在しました。
src/pkg/deps.bash
からのマッピング削除
src/pkg/deps.bash
から古いパッケージ名マッピングが削除されたことは、Go 1への移行が完了に近づいていることを示唆しています。これらのマッピングは、移行期間中に古いパッケージ名への参照を新しい名前に解決するために一時的に必要でした。マッピングが削除されたということは、システムが新しいパッケージ構造に完全に移行し、古い名前への参照がもはや存在しないか、または許容されないことを意味します。これは、Goエコシステム全体の安定化に向けた重要なステップでした。
package
宣言の変更 (html/template
およびmath/cmplx
)
src/pkg/html/template
内のpackage html
からpackage template
への変更、およびsrc/pkg/math/cmplx
内のpackage cmath
からpackage cmplx
への変更は、単なるディレクトリ名の変更以上の意味を持ちます。これは、Go 1でこれらのパッケージの正式な名前が変更されたことを示しています。
html/template
: 元々exp/template/html
という実験的なパッケージでしたが、Go 1でhtml/template
として標準ライブラリに昇格しました。このパッケージは、HTML出力におけるクロスサイトスクリプティング(XSS)などの脆弱性を自動的にエスケープする機能を提供します。パッケージ名がtemplate
に変更されたのは、このパッケージがHTMLに特化したテンプレートエンジンであることを明確にするためです。math/cmplx
: 複素数演算を提供するパッケージです。Go 1でcmath
からcmplx
に名前が変更されました。これは、より簡潔でGoらしい命名規則に合わせたものと考えられます。
これらのpackage
宣言の変更は、Goのコードベース全体にわたる大規模なリファクタリングの一部であり、Go 1の安定性と整合性を確保するために不可欠でした。gofix
ツールは通常、import
パスの変更は処理できますが、package
宣言自体の変更は手動での確認と修正が必要となる場合がありました。
関連リンク
- Go CL 5340050: https://golang.org/cl/5340050
参考にした情報源リンク
- Go 1 Release Notes: https://go.dev/doc/go1
- Go 1 and the Future of Go Programs: https://go.dev/blog/go1
- The Go Programming Language Specification (Go 1): https://go.dev/ref/spec
- GoFix: https://go.dev/cmd/gofix/
- Go 1 compatibility: https://go.dev/doc/go1compat