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

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

このコミットは、Go言語のGo 1リリースに向けた大規模なパッケージ名変更とディレクトリ構造の再編成に対応するために、手動で編集されたファイル群をまとめたものです。主にMakefileTARG変数の更新と、パッケージ名が変更された2つのパッケージ(html/templatemath/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からcmplxexp/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つのカテゴリに分類できます。

  1. MakefileTARG変数の更新: 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に変更されており、これはパッケージ自体の名前が変更されたことを示しています。

  2. Goソースコード内のpackage宣言の変更: 一部のパッケージでは、そのパッケージが属するディレクトリ構造の変更に合わせて、Goソースコード内のpackage宣言自体が変更されました。最も顕著な例はsrc/pkg/html/templatesrc/pkg/math/cmplxです。

    • src/pkg/html/template内のファイル(例: attr.go, clone.goなど)では、package htmlpackage templateに変更されています。これは、exp/template/htmlという実験的なパッケージがhtml/templateという正式なパッケージに昇格し、そのパッケージ名がtemplateになったことを反映しています。
    • src/pkg/math/cmplx内のファイル(例: abs.go, asin.goなど)では、package cmathpackage cmplxに変更されています。これは、Go 1で複素数演算パッケージの名前がcmathからcmplxに変更されたためです。
  3. Goソースコード内のimportパスの変更: パッケージ名の変更や移動に伴い、それらのパッケージをインポートしている他のGoソースコードのimportパスも更新されました。

    • doc/effective_go.htmldoc/effective_go.tmplでは、import "http"import "net/http"に変更されています。これは、httpパッケージがnetパッケージのサブパッケージとして再編成されたためです。
    • src/pkg/html/template内のファイルでは、template/parsetext/template/parseに、templatetext/templateに、utf8unicode/utf8にそれぞれ変更されています。これは、Go 1でこれらのパッケージがより論理的な階層構造に再編成された結果です。
  4. src/pkg/deps.bashからの古いパッケージ名マッピングの削除: src/pkg/deps.bashは、Goのビルドシステムの一部として、パッケージの依存関係を解決するために使用されていたスクリプトです。このファイルには、Go 1でのパッケージ名変更に対応するための古いパッケージ名から新しいパッケージ名へのマッピングが一時的に含まれていました。このコミットでは、これらのマッピングが不要になったため、deps.bashから削除されています。これは、Go 1への移行が進行し、古いパッケージ名への参照が減少したことを示唆しています。

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

このコミットは広範囲にわたるファイルに影響を与えていますが、特に重要な変更箇所は以下の通りです。

  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での標準ライブラリの再編成を反映しています。

  2. 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への移行が進み、これらのマッピングが不要になったことを示しています。

  3. 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 htmlpackage templateに変更されています。これは、html/templateパッケージの内部的なパッケージ名が変更されたことを示します。

  4. 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 cmathpackage 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