[インデックス 14089] ファイルの概要
このコミットは、Go言語のドキュメンテーションツールであるgodoc
がGoogle App Engine上で動作する際に、Go Playgroundの例をサポートするための重要な変更を導入しています。具体的には、godoc
アプリケーションがApp Engine環境でGo Playgroundのコード実行・整形機能を利用できるように、その設定スクリプトと内部ロジックが更新されました。これにより、ユーザーはApp Engineでホストされたgodoc
インスタンスから直接Goコードの例を試すことができるようになります。
コミット
commit 4fb89c9d6a686780037ad9e49998fe8e46402b80
Author: Andrew Gerrand <adg@golang.org>
Date: Tue Oct 9 09:57:51 2012 +1100
godoc: support Playground examples on App Engine
Updates setup-godoc-app.bash to produce a working godoc app
by substituting the go1.0.x go/... packages with those from tip.
R=gri
CC=golang-dev
https://golang.org/cl/6587080
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/4fb89c9d6a686780037ad9e49998fe8e46402b80
元コミット内容
このコミットの元の内容は以下の通りです。
godoc: support Playground examples on App Engine
Updates setup-godoc-app.bash to produce a working godoc app
by substituting the go1.0.x go/... packages with those from tip.
R=gri
CC=golang-dev
https://golang.org/cl/6587080
変更の背景
Go言語の公式ドキュメンテーションツールであるgodoc
は、Goのソースコードからドキュメントを生成し、ウェブサーバーとして提供する機能を持っています。Go Playgroundは、ブラウザ上でGoコードを記述、実行、共有できるインタラクティブな環境です。Go Playgroundの機能は、Goの公式ウェブサイト(play.golang.org)で提供されており、Goのドキュメントに含まれるコード例をその場で試すことができるため、学習やデバッグに非常に役立ちます。
このコミットが作成された2012年当時、Go言語はまだ比較的新しく、Go 1.0がリリースされたばかりの時期でした。godoc
をGoogle App Engine(GAE)上でホストするニーズがありましたが、GAE環境でgodoc
がGo Playgroundの機能(コードのコンパイル、実行、整形)を適切に提供するためには、いくつかの課題がありました。
主な課題は以下の点に集約されます。
- Go Playground機能の統合:
godoc
が提供するドキュメント内のコード例を、GAE上で動作するgodoc
インスタンスから直接Go Playgroundに送信し、結果を受け取るメカニズムが必要でした。 - App Engineの制約: App Engineはサンドボックス環境であり、通常のファイルシステムアクセスや外部プロセス実行に制限があります。そのため、ローカルの
godoc
がGo Playgroundと連携する方法(例えば、play.golang.org
へのHTTPリクエスト)を、App Engineの制約下で安全かつ効率的に実現する必要がありました。特に、外部HTTPリクエストにはApp Engineのurlfetch
サービスを使用する必要があります。 - Goパッケージのバージョン管理:
godoc
が参照するGoの標準ライブラリパッケージ(go/...
)と、Go Playgroundが使用するGoのバージョン("tip"、つまり最新の開発版)との間に差異が生じる可能性がありました。GAE上で動作するgodoc
が、Go Playgroundの最新の機能や挙動を正確に反映するためには、godoc
アプリケーションがGo Playgroundと同じバージョンのGoパッケージを参照できるようにする必要がありました。このコミットメッセージにある「substituting the go1.0.x go/... packages with those from tip」という記述は、この課題への対応を示しています。
このコミットは、これらの課題を解決し、App Engine上で動作するgodoc
がGo Playgroundの機能を完全にサポートできるようにすることを目的としています。
前提知識の解説
Go言語 (Golang)
Googleによって開発されたオープンソースのプログラミング言語です。静的型付け、コンパイル型、並行処理のサポート(ゴルーチンとチャネル)、ガベージコレクションなどの特徴を持ちます。シンプルで効率的な設計がされており、特にネットワークサービスや分散システムの開発に適しています。
godoc
Go言語の公式ドキュメンテーションツールです。Goのソースコード(.go
ファイル)からコメントや関数シグネチャなどを解析し、自動的にドキュメントを生成します。生成されたドキュメントは、ウェブサーバーとして提供することができ、Goの標準ライブラリやサードパーティのパッケージのドキュメントをブラウザで閲覧する際に利用されます。godoc
は、コードとドキュメントを密接に連携させる「ドキュメント・ドリブン・デベロップメント」の哲学を体現しています。
Go Playground
Go言語の公式ウェブサイト(play.golang.org)で提供されている、インタラクティブなGoコード実行環境です。ユーザーはブラウザ上でGoコードを記述し、サーバーサイドでコンパイル・実行された結果を即座に確認できます。この環境は、Goの学習、コードスニペットの共有、簡単なプロトタイピングなどに広く利用されています。Go Playgroundのバックエンドは、Goのコンパイラとランタイムをサンドボックス環境で実行し、セキュリティとリソース管理を確保しています。
Google App Engine (GAE)
Googleが提供するPlatform as a Service (PaaS) です。開発者はアプリケーションのコードをデプロイするだけで、インフラストラクチャの管理をGoogleに任せることができます。GAEは、スケーラビリティ、信頼性、セキュリティに優れており、ウェブアプリケーションやモバイルバックエンドの構築に適しています。Go言語はGAEでサポートされているランタイムの一つです。GAE環境では、セキュリティ上の理由から、ファイルシステムへの直接アクセスや任意の外部プロセス実行など、一部の機能に制限があります。外部へのHTTPリクエストは、GAEが提供するurlfetch
サービスを介して行う必要があります。
go env GOROOT
Goコマンドのサブコマンドの一つで、Goのインストールディレクトリ(GOROOT)のパスを出力します。これは、Goの環境変数をプログラム的に取得する際に便利です。
go/...
パッケージと "tip"
Go言語の標準ライブラリは、go
モジュール(以前はsrc/pkg/go
ディレクトリ以下)に格納されています。例えば、go/ast
は抽象構文木(AST)を扱うパッケージ、go/parser
はGoソースコードを解析するパッケージです。
"tip"とは、バージョン管理システム(この場合はMercurial、後にGit)における最新の開発ブランチの先端を指す用語です。つまり、「tipのGoパッケージ」とは、Go言語の最新の開発版の標準ライブラリパッケージを意味します。Go 1.0がリリースされた後も、Go言語の開発は継続されており、godoc
がGo Playgroundの最新の挙動を反映するためには、最新のGoパッケージを参照する必要がありました。
技術的詳細
このコミットは、godoc
アプリケーションがApp Engine上でGo Playgroundの機能をサポートするために、以下の主要な技術的変更を導入しています。
-
Go Playground機能の分離と共通化 (
play.go
の導入):- 以前は
src/cmd/godoc/main.go
内に直接記述されていたGo Playground関連のHTTPハンドラ(/compile
,/share
,/fmt
)の登録ロジックが、新しく作成されたsrc/cmd/godoc/play.go
に集約されました。 play.go
には、Go PlaygroundのベースURL (http://play.golang.org
) の定数定義、ハンドラ登録関数registerPlaygroundHandlers
、コード整形機能を提供するfmtHandler
とgofmt
、そして機能が無効な場合に501エラーを返すdisabledHandler
が含まれています。- これにより、Go Playground関連のコードがモジュール化され、保守性が向上しました。
- 以前は
-
App Engineとローカル環境でのGo Playground連携の分離:
- Go Playgroundへのリクエストを転送する
bounceToPlayground
関数が、App Engine環境とローカル環境で異なる実装を持つようになりました。 src/cmd/godoc/play-appengine.go
(App Engine向け):+build appengine
ビルドタグにより、App Engine環境でのみコンパイルされます。appengine.NewContext(req)
でApp Engineのコンテキストを取得し、appengine/urlfetch.Client(c)
を使用してHTTPクライアントを作成します。これにより、App Engineの制約下で外部へのHTTPリクエスト(play.golang.org
への転送)が安全かつ効率的に行われます。エラーロギングにはc.Errorf
が使用されます。
src/cmd/godoc/play-local.go
(ローカル向け):+build !appengine
ビルドタグにより、App Engine以外の環境(通常のローカル実行)でコンパイルされます。- 標準の
net/http.Post
を使用してplay.golang.org
へリクエストを転送します。URLのスキームとホストは、playgroundBaseURL
から解析して設定されます。
- Go Playgroundへのリクエストを転送する
-
godoc
アプリケーションのセットアップスクリプトの強化 (setup-godoc-app.bash
):- このシェルスクリプトは、App Engine上で動作する
godoc
アプリケーションを構築するためのものです。 GOROOT
の検出改善: 以前はGOROOT
が設定されていない場合にカレントディレクトリを使用する可能性がありましたが、go env GOROOT
コマンドを使用してGoのインストールパスを確実に取得するように変更されました。これにより、スクリプトの堅牢性が向上しました。- アプリケーションディレクトリの構造化:
mkdir $APPDIR
で新しいアプリケーションディレクトリを作成します。copyGodoc
関数が追加され、$GOROOT/src/cmd/godoc
ディレクトリ全体を$APPDIR/godoc
にコピーします。copyGoPackages
関数が追加され、Go 1.0.xのgo/...
パッケージを"tip"のパッケージに置き換えるというコミットメッセージの核心部分を実装しています。具体的には、$GOROOT/src/pkg/go
を$APPDIR/newgo
にコピーし、コピーされたGoファイル内のimport "go/..."
をimport "newgo/..."
にsed
コマンドで書き換えます。これにより、App Engine上のgodoc
がGo Playgroundの最新の挙動と一致するGoパッケージを参照できるようになります。makeAppYaml
関数が追加され、App Engineのデプロイに必要なapp.yaml
ファイルを自動生成します。このファイルは、godoc
アプリケーションがGo 1ランタイムを使用し、すべてのURLパスをGoアプリケーション (_go_app
) で処理するように設定します。
- クリーンアップロジックの変更: 以前の
cleanup
関数が削除され、新しいセットアップフロー(mkdir
,copyGodoc
,copyGoPackages
,makeAppYaml
,makeZipfile
,makeIndexfile
,splitIndexfile
,makeConfigfile
)が導入されました。これにより、App Engineアプリケーションの構築プロセスがより体系的になりました。
- このシェルスクリプトは、App Engine上で動作する
これらの変更により、godoc
はApp Engineのサンドボックス環境の制約を尊重しつつ、Go Playgroundのインタラクティブなコード実行・整形機能を提供できるようになりました。
コアとなるコードの変更箇所
このコミットにおけるコアとなるコードの変更箇所は、主に以下のファイルに分散しています。
-
src/cmd/godoc/appinit.go
:--- a/src/cmd/godoc/appinit.go +++ b/src/cmd/godoc/appinit.go @@ -37,6 +37,7 @@ func init() { *indexFiles = indexFilenames *maxResults = 100 // reduce latency by limiting the number of fulltext search results *indexThrottle = 0.3 // in case *indexFiles is empty (and thus the indexer is run) + *showPlayground = true // read .zip file and set up file systems const zipfile = zipFilename @@ -51,6 +52,7 @@ func init() { readTemplates() initHandlers() registerPublicHandlers(http.DefaultServeMux) + registerPlaygroundHandlers(http.DefaultServeMux) // initialize default directory tree with corresponding timestamp. initFSTree()
*showPlayground = true
を設定し、App Engine環境でGo Playground機能を有効にします。registerPlaygroundHandlers(http.DefaultServeMux)
を呼び出し、Go Playground関連のHTTPハンドラを登録します。
-
src/cmd/godoc/main.go
:--- a/src/cmd/godoc/main.go +++ b/src/cmd/godoc/main.go @@ -282,14 +282,7 @@ func main() { } registerPublicHandlers(http.DefaultServeMux) - - playHandler := disabledHandler - if *showPlayground { - playHandler = bounceToPlayground - } - http.HandleFunc("/compile", playHandler) - http.HandleFunc("/share", playHandler) - http.HandleFunc("/fmt", playHandler) + registerPlaygroundHandlers(http.DefaultServeMux) // Initialize default directory tree with corresponding timestamp. // (Do it in a goroutine so that launch is quick.) @@ -469,25 +462,3 @@ type httpWriter struct { func (w *httpWriter) Header() http.Header { return w.h }\n func (w *httpWriter) WriteHeader(code int) { w.code = code }\n- -// bounceToPlayground forwards the request to play.golang.org.\n-// TODO(adg): implement this stuff locally.\n-func bounceToPlayground(w http.ResponseWriter, req *http.Request) {\n-\tdefer req.Body.Close()\n-\treq.URL.Scheme = "http"\n-\treq.URL.Host = "play.golang.org"\n-\tresp, err := http.Post(req.URL.String(), req.Header.Get("Content-type"), req.Body)\n-\tif err != nil {\n-\t\thttp.Error(w, err.Error(), 500)\n-\t\treturn\n-\t}\n-\tw.WriteHeader(resp.StatusCode)\n-\tio.Copy(w, resp.Body)\n-\tresp.Body.Close()\n-}\n-\n-// disabledHandler serves a 501 "Not Implemented" response.\n-func disabledHandler(w http.ResponseWriter, r *http.Request) {\n-\tw.WriteHeader(http.StatusNotImplemented)\n-\tfmt.Fprint(w, "This functionality is not available via local godoc.")\n-}\
- 以前のGo Playground関連のハンドラ登録と、
bounceToPlayground
、disabledHandler
関数の定義が削除され、registerPlaygroundHandlers
の呼び出しに置き換えられました。これにより、main.go
のコードが簡潔になり、Go Playgroundロジックがplay.go
に完全に委譲されました。
- 以前のGo Playground関連のハンドラ登録と、
-
src/cmd/godoc/play-appengine.go
(新規ファイル):// +build appengine package main import ( "io" "net/http" "appengine" "appengine/urlfetch" ) func bounceToPlayground(w http.ResponseWriter, req *http.Request) { c := appengine.NewContext(req) client := urlfetch.Client(c) url := playgroundBaseURL + req.URL.Path defer req.Body.Close() resp, err := client.Post(url, req.Header.Get("Content-type"), req.Body) if err != nil { http.Error(w, "Internal Server Error", 500) c.Errorf("making POST request:", err) return } defer resp.Body.Close() if _, err := io.Copy(w, resp.Body); err != nil { http.Error(w, "Internal Server Error", 500) c.Errorf("making POST request:", err) } }
- App Engine環境でのみコンパイルされる
bounceToPlayground
の実装です。appengine/urlfetch
を使用して外部リクエストを行います。
- App Engine環境でのみコンパイルされる
-
src/cmd/godoc/play-local.go
(新規ファイル):// +build !appengine package main import ( "io" "net/http" "net/url" ) var playgroundScheme, playgroundHost string func init() { u, err := url.Parse(playgroundBaseURL) if err != nil { panic(err) } playgroundScheme = u.Scheme playgroundHost = u.Host } // bounceToPlayground forwards the request to play.golang.org. func bounceToPlayground(w http.ResponseWriter, req *http.Request) { defer req.Body.Close() req.URL.Scheme = playgroundScheme req.URL.Host = playgroundHost resp, err := http.Post(req.URL.String(), req.Header.Get("Content-type"), req.Body) if err != nil { http.Error(w, err.Error(), 500) return } w.WriteHeader(resp.StatusCode) io.Copy(w, resp.Body) resp.Body.Close() }
- ローカル環境でのみコンパイルされる
bounceToPlayground
の実装です。標準のnet/http
を使用します。
- ローカル環境でのみコンパイルされる
-
src/cmd/godoc/play.go
(新規ファイル):package main import ( "bytes" "encoding/json" "fmt" "go/ast" "go/parser" "go/printer" "go/token" "net/http" ) // The server that will service compile and share requests. const playgroundBaseURL = "http://play.golang.org" func registerPlaygroundHandlers(mux *http.ServeMux) { if *showPlayground { mux.HandleFunc("/compile", bounceToPlayground) mux.HandleFunc("/share", bounceToPlayground) } else { mux.HandleFunc("/compile", disabledHandler) mux.HandleFunc("/share", disabledHandler) } http.HandleFunc("/fmt", fmtHandler) } type fmtResponse struct { Body string Error string } // fmtHandler takes a Go program in its "body" form value, formats it with // standard gofmt formatting, and writes a fmtResponse as a JSON object. func fmtHandler(w http.ResponseWriter, r *http.Request) { resp := new(fmtResponse) body, err := gofmt(r.FormValue("body")) if err != nil { resp.Error = err.Error() } else { resp.Body = body } json.NewEncoder(w).Encode(resp) } // gofmt takes a Go program, formats it using the standard Go formatting // rules, and returns it or an error. func gofmt(body string) (string, error) { fset := token.NewFileSet() f, err := parser.ParseFile(fset, "prog.go", body, parser.ParseComments) if err != nil { return "", err } ast.SortImports(fset, f) var buf bytes.Buffer err = printer.Fprint(&buf, fset, f) if err != nil { return "", err } return buf.String(), nil } // disabledHandler serves a 501 "Not Implemented" response. func disabledHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) fmt.Fprint(w, "This functionality is not available via local godoc.") }
- Go Playground関連の共通ロジックをカプセル化しています。
playgroundBaseURL
の定義、registerPlaygroundHandlers
によるハンドラ登録、fmtHandler
とgofmt
によるコード整形機能、そしてdisabledHandler
が含まれます。
- Go Playground関連の共通ロジックをカプセル化しています。
-
src/cmd/godoc/setup-godoc-app.bash
:--- a/src/cmd/godoc/setup-godoc-app.bash +++ b/src/cmd/godoc/setup-godoc-app.bash @@ -4,13 +4,14 @@ # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file.\n -# This script creates the .zip, index, and configuration files for running\n-# godoc on app-engine.\n +# This script creates a complete godoc app in $APPDIR.\n+# It copies the cmd/godoc and src/pkg/go/... sources from GOROOT,\n+# synthesizes an app.yaml file, and creates the .zip, index, and\n+# configuration files.\n # # If an argument is provided it is assumed to be the app-engine godoc directory.\n-# Without an argument, $APPDIR is used instead. If GOROOT is not set, the\n-# current working directory is assumed to be $GOROOT. Various sanity checks\n-# prevent accidents.\n +# Without an argument, $APPDIR is used instead. If GOROOT is not set, "go env"\n+# is consulted to find the $GOROOT.\n # # The script creates a .zip file representing the $GOROOT file system\n # and computes the correspondig search index files. These files are then\n # @@ -29,8 +30,8 @@ error() {\n \n getArgs() {\n \tif [ -z $GOROOT ]; then\n-\t\tGOROOT=$(pwd)\n-\t\techo "GOROOT not set, using cwd instead"\n+\t\tGOROOT=$(go env GOROOT)\n+\t\techo "GOROOT not set explicitly, using $GOROOT instead"\n \tfi\n \tif [ -z $APPDIR ]; then\n \t\tif [ $# == 0 ]; then\n@@ -47,14 +48,8 @@ getArgs() {\n \tif [ ! -x $GOROOT/bin/godoc ]; then\n \t\terror "$GOROOT/bin/godoc does not exist or is not executable"\n \tfi\n-\tif [ ! -d $APPDIR ]; then\n-\t\terror "$APPDIR is not a directory"\n-\tfi\n-\tif [ ! -e $APPDIR/app.yaml ]; then\n-\t\terror "$APPDIR is not an app-engine directory; missing file app.yaml"\n-\tfi\n-\tif [ ! -d $APPDIR/godoc ]; then\n-\t\terror "$APPDIR is missing directory godoc"\n+\tif [ -e $APPDIR ]; then\n+\t\terror "$APPDIR exists; check and remove it before trying again"\n \tfi\n \n \t# reporting\n@@ -62,12 +57,32 @@ getArgs() {\n \techo "APPDIR = $APPDIR"\n }\n \n-cleanup() {\n-\techo "*** cleanup $APPDIR"\n-\trm $APPDIR/$ZIPFILE\n-\trm $APPDIR/$INDEXFILE\n-\trm $APPDIR/$SPLITFILES*\n-\trm $APPDIR/$CONFIGFILE\n+copyGodoc() {\n+\techo "*** copy $GOROOT/src/cmd/godoc to $APPDIR/godoc"\n+\tcp -r $GOROOT/src/cmd/godoc $APPDIR/godoc\n+}\n+\n+copyGoPackages() {\n+\techo "*** copy $GOROOT/src/pkg/go to $APPDIR/newgo and rewrite imports"\n+\tcp -r $GOROOT/src/pkg/go $APPDIR/newgo\n+\tfind $APPDIR/newgo -type d -name testdata | xargs rm -r\n+\tgofiles=$(find $APPDIR -name '*.go')\n+\tsed -i '' 's_^\(."\)\(go/[a-z]*\)"_\\1new\\2"_' $gofiles\n+\tsed -i '' 's_^\(import "\)\(go/[a-z]*\)\"_\1new\2"_' $gofiles\n+}\n+\n+makeAppYaml() {\n+\techo "*** make $APPDIR/app.yaml"\n+\tcat > $APPDIR/app.yaml <<EOF\n+application: godoc\n+version: 1\n+runtime: go\n+api_version: go1\n+\n+handlers:\n+- url: /.*\n+ script: _go_app\n+EOF\n }\n \n makeZipfile() {\n@@ -112,7 +127,11 @@ EOF\n }\n \n getArgs "$@"\n-cleanup\n+set -e\n+mkdir $APPDIR\n+copyGodoc\n+copyGoPackages\n+makeAppYaml\n makeZipfile\n makeIndexfile\n splitIndexfile\n ``` * `GOROOT`の取得方法が`go env GOROOT`に変更されました。 * `copyGodoc`、`copyGoPackages`、`makeAppYaml`という新しい関数が追加され、App Engineアプリケーションの構築プロセスが大幅に改善されました。特に`copyGoPackages`は、`go/...`パッケージを`newgo/...`にコピーし、インポートパスを書き換えることで、Go Playgroundの最新のGoパッケージとの互換性を確保します。 * アプリケーションのセットアップフローが、`mkdir`、`copyGodoc`、`copyGoPackages`、`makeAppYaml`、`makeZipfile`、`makeIndexfile`、`splitIndexfile`、`makeConfigfile`という新しいシーケンスに変更されました。
コアとなるコードの解説
このコミットの核心は、godoc
がApp Engine上でGo Playgroundの機能を適切に利用できるようにするための、Go Playground関連ロジックのモジュール化と、setup-godoc-app.bash
スクリプトによるGoパッケージのバージョン調整です。
-
Go Playgroundロジックの分離と共通化 (
play.go
,play-appengine.go
,play-local.go
):- 以前は
main.go
に直接埋め込まれていたGo Playground関連のHTTPハンドラ登録や、play.golang.org
へのリクエスト転送ロジックが、play.go
に共通部分として抽出されました。 play.go
のregisterPlaygroundHandlers
関数は、*showPlayground
フラグ(appinit.go
でtrue
に設定される)に基づいて、/compile
と/share
パスにbounceToPlayground
ハンドラを登録します。これにより、これらのパスへのリクエストはplay.golang.org
に転送されます。/fmt
パスにはfmtHandler
が登録され、これはGoコードの整形機能を提供します。bounceToPlayground
の実装は、ビルドタグ(+build appengine
と+build !appengine
)によって、App Engine環境とローカル環境で切り替えられます。play-appengine.go
では、App Engineのappengine/urlfetch
サービスを利用して外部HTTPリクエストを行います。これはApp Engineのサンドボックス環境の制約に対応するための必須の変更です。play-local.go
では、標準のnet/http
パッケージを使用して外部HTTPリクエストを行います。
- この分離により、コードの可読性、保守性、そして異なる環境への適応性が大幅に向上しました。
- 以前は
-
setup-godoc-app.bash
によるGoパッケージの調整:- このシェルスクリプトの最も重要な変更は、
copyGoPackages
関数です。この関数は、$GOROOT/src/pkg/go
(Goの標準ライブラリパッケージ)をApp Engineアプリケーションのディレクトリ内の$APPDIR/newgo
にコピーします。 - さらに、コピーされたGoファイル内の
import "go/..."
というインポートパスを、import "newgo/..."
にsed
コマンドで一括置換します。 - この置換の目的は、App Engine上で動作する
godoc
が、Go Playgroundが使用するGoの"tip"(最新開発版)のパッケージを参照できるようにすることです。Go 1.0.xの環境でgodoc
をビルドした場合でも、このスクリプトを実行することで、Go Playgroundの最新の挙動と互換性のあるGoパッケージがApp Engineアプリケーションにバンドルされるようになります。これにより、Go Playgroundのコード例がApp Engine上のgodoc
で正しく動作することが保証されます。 makeAppYaml
関数は、App Engineアプリケーションのデプロイ設定ファイルであるapp.yaml
を自動生成し、Go 1ランタイムを使用し、すべてのリクエストをGoアプリケーションで処理するように設定します。
- このシェルスクリプトの最も重要な変更は、
これらの変更は、godoc
がApp Engineという特定のクラウド環境で、Go Playgroundというインタラクティブな機能をシームレスに提供するための、基盤となる技術的解決策を提供しています。
関連リンク
- Go言語公式サイト: https://golang.org/
- Go Playground: https://play.golang.org/
- Google App Engine: https://cloud.google.com/appengine
- Go Playgroundの仕組みに関する公式ブログ記事 (参考): https://go.dev/blog/playground
参考にした情報源リンク
- コミットハッシュ:
4fb89c9d6a686780037ad9e49998fe8e46402b80
- GitHub上のコミットページ: https://github.com/golang/go/commit/4fb89c9d6a686780037ad9e49998fe8e46402b80
- Gerrit Code Review (CL 6587080): https://golang.org/cl/6587080 (Goプロジェクトのコードレビューシステム)
- Go言語のドキュメンテーション (godoc): https://pkg.go.dev/cmd/godoc
- Google App EngineのGoランタイムに関するドキュメント (当時の情報に基づく): https://cloud.google.com/appengine/docs/standard/go/ (現在のドキュメントは更新されている可能性があります)
appengine/urlfetch
パッケージのドキュメント (当時の情報に基づく): https://pkg.go.dev/appengine/urlfetch (現在のドキュメントは更新されている可能性があります)go/parser
パッケージのドキュメント: https://pkg.go.dev/go/parsergo/printer
パッケージのドキュメント: https://pkg.go.dev/go/printergo/ast
パッケージのドキュメント: https://pkg.go.dev/go/astgo/token
パッケージのドキュメント: https://pkg.go.dev/go/token