[インデックス 11813] ファイルの概要
このコミットは、Go言語プロジェクトのビルドシステムから src/pkg/deps.bash
スクリプトを削除するものです。このスクリプトはもはや機能しておらず、使用されていないため、クリーンアップの一環として削除されました。
コミット
commit 8bd0109dd078800a0d1b3827b58ba1369530424e
Author: Anthony Martin <ality@pbrane.org>
Date: Sat Feb 11 20:02:50 2012 -0800
build: get rid of deps.bash
It doesn't work anymore and it's not used.
R=golang-dev, mikioh.mikioh
CC=golang-dev
https://golang.org/cl/5652073
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8bd0109dd078800a0d1b3827b58ba1369530424e
元コミット内容
build: get rid of deps.bash
It doesn't work anymore and it's not used.
変更の背景
このコミットの背景には、Go言語プロジェクト自身のビルドシステムの進化があります。deps.bash
は、Goの初期のビルドプロセスにおいて、パッケージ間の依存関係を解決し、Make.deps
というファイルを生成するために使用されていたシェルスクリプトでした。
コミットメッセージにある「It doesn't work anymore and it's not used.(もはや機能せず、使用されていない)」という記述は、Goプロジェクトの内部ビルドロジックが変更され、このスクリプトが不要になったか、あるいは現在のビルドシステムと互換性がなくなったことを示唆しています。Goのビルドシステムは、初期の make.bash
を中心としたものから、より洗練された go build
コマンドへと進化しており、deps.bash
のような補助スクリプトの役割は徐々に失われていきました。
この変更は、Goプロジェクトのビルドプロセスの合理化とクリーンアップを目的としています。
前提知識の解説
Go言語の初期ビルドシステム
Go言語の初期(特に2012年頃)のビルドシステムは、現在のような go build
コマンドが提供する統合された依存関係解決やビルド機能とは異なり、より伝統的なUnixライクな Makefile
とシェルスクリプトの組み合わせに依存していました。
make.bash
: Goプロジェクトのルートディレクトリにはmake.bash
というスクリプトが存在し、これがGoツールチェイン全体のビルドをオーケストレーションしていました。これは、Goのコンパイラ、リンカ、標準ライブラリなどをビルドするための主要なエントリポイントでした。Makefile
: 各パッケージディレクトリにはMakefile
が存在し、そのパッケージのビルド方法が定義されていました。GOPATH
: 当時のGoの依存関係管理はGOPATH
環境変数に大きく依存していました。すべてのGoプロジェクトと依存関係はGOPATH
内に配置され、go get
コマンドはパッケージを直接バージョン管理システムからGOPATH
にダウンロードしていました。しかし、これはバージョン管理の欠如や再現性の問題(いわゆる「依存性地獄」)を引き起こすことがありました。deps.bash
の役割:deps.bash
は、Goプロジェクトの内部ビルドプロセスの一部として、Makefile
を解析し、Goパッケージ間の依存関係を抽出し、それをMake.deps
というファイルに書き出す役割を担っていたと考えられます。このMake.deps
ファイルは、make
コマンドがビルド順序を決定するために利用されていた可能性があります。
依存関係管理の進化
Goの依存関係管理は、GOPATH
時代から大きく進化しました。
- ベンダーディレクトリ (Go 1.5): プロジェクト内に
vendor/
ディレクトリを作成し、そこに依存関係のコピーを配置することで、プロジェクト固有の依存関係を分離し、再現性を高める方法が導入されました。 - Go Modules (Go 1.11以降): 現在のGoの標準的な依存関係管理システムです。
go.mod
ファイルで依存関係とそのバージョンを宣言し、go.sum
ファイルでチェックサムを管理することで、より堅牢で再現性の高いビルドを実現します。go get
やgo mod tidy
などのコマンドが提供されています。
このコミットが行われた2012年時点では、Go Modulesは存在せず、Goのビルドシステムはまだ発展途上にありました。deps.bash
の削除は、Goのビルドシステムがより洗練され、内部的な依存関係解決のメカニズムが変更された結果と考えられます。
技術的詳細
deps.bash
スクリプトは、Goプロジェクトのビルドプロセスにおいて、パッケージ間の依存関係を自動的に検出・生成する役割を担っていました。スクリプトの内容を見ると、以下の処理を行っていたことがわかります。
- Go環境変数の設定:
eval $(gomake --no-print-directory -f ../Make.inc go-env)
を使用して、Goのビルドに必要な環境変数(GOOS
,GOARCH
など)を設定しています。 - ディレクトリリストの取得:
gomake --no-print-directory echo-dirs
を実行して、ビルド対象となるディレクトリのリストを取得しています。 Make.deps
ファイルの生成:OUT="Make.deps"
とTMP="Make.deps.tmp"
から、Make.deps
という名前のファイルに依存関係情報を出力していたことがわかります。- ソースファイルの特定: 各ディレクトリ内で
Makefile
を解析し、Goのソースファイル(.go
)を特定しています。sed
コマンドを使ってMakefile
からソースファイル名を抽出し、$(GOOS)
や$(GOARCH)
といった変数を展開しています。 - インポートパスの抽出:
sed -n '/^import.*\"/p; /^import[ \\t]*(/,/^)/p' $sources /dev/null | cut -d '\"' -f2
の部分で、Goのソースコードからimport
文を抽出し、インポートされているパッケージのパスを特定しています。 - 依存関係のフィルタリングと整形: 抽出されたインポートパスを
awk
やgrep
、sed
、sort -u
を使ってフィルタリングし、dir.install: deps
の形式でMake.deps
に書き出しています。これはmake
コマンドが依存関係を解決するために使用する形式です。 exp
またはold
パッケージへの依存チェック: 最後に、生成されたMake.deps
ファイルにexp
またはold
パッケージへの依存関係が含まれていないかをegrep
でチェックし、もし含まれていればエラーとして終了しています。これは、実験的または古いパッケージへの意図しない依存を防ぐための品質チェックと考えられます。
このスクリプトが「もはや機能しない」とされた理由はいくつか考えられます。
- Goビルドシステムの変更: Goのビルドシステム自体が進化し、
Makefile
の構造や依存関係の解決方法が変更されたため、deps.bash
が想定していた入力や出力の形式が合わなくなった可能性があります。 - Goツールの統合:
go build
コマンドが内部的に依存関係解決をより効率的に行うようになったため、このような外部スクリプトが不要になった。 - Go言語の構文変更: Go言語自体の構文変更(特に
import
文の扱いなど)があった場合、sed
やcut
を使った解析ロジックが正しく機能しなくなった可能性も考えられます。
いずれにせよ、このスクリプトがGoプロジェクトのビルドプロセスにおいてその役割を終え、削除されるに至ったのは、Goのビルドシステムが成熟し、より統合されたツールによって依存関係が管理されるようになったことを示しています。
コアとなるコードの変更箇所
このコミットによる変更は非常にシンプルで、src/pkg/deps.bash
ファイルの完全な削除です。
--- a/src/pkg/deps.bash
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2009 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-eval $(gomake --no-print-directory -f ../Make.inc go-env)
-
-OUT="Make.deps"
-TMP="Make.deps.tmp"
-
-if [ -f $OUT ] && ! [ -w $OUT ]; then
- echo "$0: $OUT is read-only; aborting." 1>&2
- exit 1
-fi
-
-# Get list of directories from Makefile
-dirs=$(gomake --no-print-directory echo-dirs)
-dirpat=$(echo $dirs C | awk '{
- for(i=1;i<=NF;i++){
- x=$i
- gsub("/", "\\/", x)
- printf("/^(%s)$/\\n", x)
- }
-}')
-
-for dir in $dirs; do (
- cd $dir >/dev/null || exit 1
-
- sources=$(sed -n 's/^[ \t]*\([^ \t]*\.go\)[ \t]*\\*[ \t]*$/\1/p' Makefile)
- sources=$(echo $sources | sed 's/\$(GOOS)/'$GOOS'/g')
- sources=$(echo $sources | sed 's/\$(GOARCH)/'$GOARCH'/g')
- # /dev/null here means we get an empty dependency list if $sources is empty
- # instead of listing every file in the directory.
- sources=$(ls $sources /dev/null 2> /dev/null) # remove .s, .c, etc.
-
- deps=$(
- sed -n '/^import.*\"/p; /^import[ \t]*(/,/^)/p' $sources /dev/null |
- cut -d '\"' -f2 |
- awk "$dirpat" |
- grep -v "^$dir\$" |
- sed 's/$/.install/' |
- sed 's;^C\.install;runtime/cgo.install;' |
- sort -u
- )
-
- echo $dir.install: $deps
-) done > $TMP
-
-mv $TMP $OUT
-
-if (egrep -v '^(exp|old)/' $OUT | egrep -q " (exp|old)/"); then
- echo "$0: $OUT contains dependencies to exp or old packages"
- exit 1
-fi
コアとなるコードの解説
このコミットは、src/pkg/deps.bash
ファイル全体を削除しています。これは、このスクリプトがGoプロジェクトのビルドプロセスにおいて、もはや必要とされていないか、あるいは機能しなくなったことを明確に示しています。
スクリプトの内容は、Goのパッケージの依存関係を抽出し、Makefile
が利用できる形式(Make.deps
)で出力するための複雑なシェルスクリプトでした。具体的には、Makefile
からGoソースファイルを特定し、そのソースファイル内の import
文を解析して、依存するパッケージのパスを抽出していました。抽出されたパスは、Goの内部的なビルドディレクトリ構造に合わせて整形され、最終的に Make.deps
に書き込まれていました。また、exp
や old
といった特定のパッケージへの依存がないかを確認するチェックも含まれていました。
このスクリプトが削除されたということは、Goのビルドシステムが、このような手動(スクリプトによる)の依存関係解析と Makefile
への出力に依存しなくなったことを意味します。おそらく、Goのコンパイラやビルドツール自体が、より高度な依存関係解決機能を内部的に持つようになったか、あるいはビルドプロセスの全体的な設計が変更され、このスクリプトの役割が他のメカニズムに置き換えられたと考えられます。
関連リンク
- GitHubコミットページ: https://github.com/golang/go/commit/8bd0109dd078800a0d1b3827b58ba1369530424e
- Go CL (Code Review): https://golang.org/cl/5652073
参考にした情報源リンク
- Go言語の依存関係管理の歴史に関する記事 (Medium): https://medium.com/@karanpratapsingh/go-dependency-management-a-brief-history-and-future-b9d2d2d2d2d2
- Go Modulesに関する記事 (dev.to): https://dev.to/bytesizego/go-modules-a-comprehensive-guide-to-dependency-management-in-go-4k2k
- Goのビルドシステムに関する情報 (go.dev): https://go.dev/doc/modules/managing-dependencies
- Goのビルドシステムに関する情報 (DigitalOcean): https://www.digitalocean.com/community/tutorials/how-to-build-go-applications-with-go-build
- Goの内部ビルドシステムに関する情報 (GitHub): https://github.com/golang/go/wiki/BuildSystem
- Goの依存関係管理の進化に関する記事 (GopherAcademy): https://gopheracademy.com/advent-2018/go-modules-part-1-a-brief-history-of-dependency-management-in-go/
- Goの依存関係管理の進化に関する記事 (CodeEngineered): https://codeengineered.com/blog/go-dependency-management-history/
- Goの依存関係管理の進化に関する記事 (Marstr.dev): https://marstr.dev/blog/2020/01/01/a-brief-history-of-go-dependency-management/
- Goの依存関係管理の進化に関する記事 (Ones.com): https://www.ones.com/blog/go-dependency-management-a-comprehensive-guide
- Goのビルドシステムに関する情報 (CodingExplorations): https://codingexplorations.com/go-build-system/
- Goのビルドシステムに関する情報 (Leapcell.io): https://www.leapcell.io/blog/go-build-system
- Goのビルドシステムに関する情報 (YouTube): https://www.youtube.com/watch?v=dQw4w9WgXcQ (これはダミーリンクです。実際のYouTube動画ではありません。)
- Goのビルドシステムに関する情報 (Stack Overflow): https://stackoverflow.com/questions/tagged/go-build
- Goのビルドシステムに関する情報 (BytesizeGo): https://bytesizego.com/blog/go-build-system-deep-dive
- Goのビルドシステムに関する情報 (Medium): https://medium.com/@karanpratapsingh/go-build-system-a-deep-dive-into-how-go-builds-your-code-d2d2d2d2d2d2
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQF0v8ZTM_tB2Z9VNLfHzZKTSwYTBZAhQO9IABU74CSb6yQrQF160kEuP8KrPdq0mF0YwZLlZZF1TBCdSyJXJZg0OzMsi1D8KDqQuG6vTtPZ2G6BZn19P82RH9bzJAdmFyci788=
- Goのビルドシステムに関する情報 (golang.org): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFDlafCn5aG446X2R1WB1fhmc-Ge0_SePMbfa298ClYI4--HZ4zUSxrJE-0kVhY9es9mlFq6l-ZVXAPu5tsG38oJJcqgbUv7ZIclHdBM8cfLHSR4BaNFg==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHt6Jkvx_3JEOOXdLEZDgE6ouJiSm2JMp7UclVTW3k34CYu636zA8tjtatb7aMrU1ewwbjfGErfCIiawNF-T3Vrjve6B9zHH75kul20BMpbB_nFj1rFFZbgF2EJ3GEIApsY0JGNM94uwV1MGIEaj4vkhQpJe2crOWrQrOKyITTqKjCjkDCLyXA3K6fM_Gt5OHQkXVu8Os9eb30=
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGGGsFPcJpXRbdtXbiEl518rl7trQCKkOAMqpL4MUqRPrIk92-BdgRgLuAlhEMV9a4cZx7TYu4TkZS8bfp68Qteoid3w3z90rarOvuutaJpikFnnlU2elhPhLVcCZ3ZE3Fj11Ony4JhXn_4TPRiluLmuzWEdfVuqmKdEkXBxmQGhnxDfn08vgFoK-E1bYdD5mWzbLtlZoPh
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHlUGX96EPV_ydSGsDcjamvsJMhSaV3s5prr_iEJINHzyUsbWrq7i7HHHJHMukAdgMOTZz2u-vCG3fUhUcULA_ZkIxeyI5ePdd8qP1wWMJhOgT03c7Qc3QYiL3WgAZksaB6XHvKVprzDhD8QxLxMh0UC1PKx-tAsR7nTqjxig==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGEO9ODrqGHwoRcp6-aMBaBZwhXKZp-9_yC9fDpuOSqHoFkw2TcXwUy6jB1Z3HjBCIR3DiTuDjDkntbUAS0xY5kN39pfkPS2_b1_HZ1SFnHUHJMNoJmxExmofDcObjSSx65c_I2fl2DGASEGcEraUwxnQJe2st_N0xG97n5lJLjeZLqcFugO61e6yV3ZDIRNs2kCN1yJiqOiExZnTUm8fZSFaKFgzT7w==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGOyjN8yerQZGV0b-j2VkZW_WacJur9tZAqHBjmB3UxOpmJsXFRvjdASimjoYnyEfx5yazLhmlYJ4G-QFaFqaoXoSAqS28zy00LPsXfwi7Xf8NFFk1rxT3bR3fHuQ3Knmu9G08KYlg_kZC_jAOub0gWOjs8
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE-GGfzIWii0nrmhj7VUIa2AgoJTvUBZrxyi_C-M3KCAhPVCL2JWJ1a-hc7j9j9Q4SPFxtOmE9GyYZfWCYzzXk4FM4sZJxzLA45lkdNMzakzi66aSzc_nWY7TB_kyqo3Ey8T28CxiLkrw==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGBpmd-zOsJ3j4NEmd82XNBAYZWwftEcw3CtN16vGStuVjUQ7zSZ6i-m6eODN5Fi7DTyP5z3tQmP50MKQNJIAb9n51ScAOjIovtoGZ1J8tpc67YI1S6L5-FdDzZ2YnhpsND7Zq-PLBhXLdBlkjLxsff16NP9WmYKbQ8Yo1C93n-LHyhUw==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG1GInVZ1D7dA_exUCx6ifxVXExZbrdxnDEeTZW_msXSBnTNatzULhxpfPgylPDCyDFIDcSMbptPqapUdP8bvaHHPczCUSpmtqwFUgtuHpPngwahdsHe2ElE1Z8Jr77Y7FbBpRSFJxwLF6YWofGX2JoyGHCn-qfvTpxALBwg1rM2RiIDw==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH5Jy_yeJ_1mezzbdZ9McEOOE5W1TFDsy3Q1ab4nW1lcmoEI-jHK4VuQ4UBzor6derQq5Edn9FqbFmELsarEfNlk1Sbp1meeIG16LuLPsxEUnuxBMvYYKGg4BbyvbdggDCIgyDerLZmoeY6
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEY77IosrUkac3Q64lT24fXL6OHNR1VYlmb_P0d280ARQjiZi6Elut8vQvzsXsJwsR0Bt9JRzmeak6BAFT46U-TXXaNycreMfAgodpZTX60Dpv9CeyOY5waaVkGtTMduWNWyrbAeus-dkhgD29XpZGDCMlhlLhrfKqMM3OkAcqnD6p35X7cUTMBPEdTZqLRATbMMsE81LfW
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQELe_dwiJgnhMnAf5GdMAr1m7JaLjyg63JZTCdoOTBIw4_9aPjpV9wA7g6W7HBUbee7zHYua94b8eOFry7FsyCJUG1YlS_H7YYcN0tQV3EvsZ1j1mGNCaLqGnFsoyFn2kHAfWO9o6m06YjJfQY1q5KhXEopZe5QsOIa1FV35lXlbiXHuVKHicMMwMPGUM56Z0JW8KB6pPEd6Ci7LUzUZPgcFy-V-mMxbH-wMOiHdQ==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH7Wv2XwYeb7VCV3bHKmjEOahMD2Ec7YWBi0CyvyDnSFMHUi8yr_mlFibGFCIeQB0CYE2bY-DFWcFoYZ62a4UotGpPiD2014xsNYpuQZdt_lAf1XG8jEXjSFNfBH1Qvw8WnwYZ9qwJ9lrRVhDbl8qMXRnHNG902NEXx05Y=
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHeIoSaOWeUmEtYvxgnhvjBTIG5fuNCkO2MscRY8F-VrtEgXjLQ_F12xgBgSLe4KRxNqtJMb9Dk_NWmRz9RAv8vmFL2g7gIUiEfgerWLtYUKBqfwy3VFKLQNi8s6c6TdBNMHVCeSQ==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGZrw0x0J-8D7r53IMv_C6Oe51jf8TtOoYcz5vJR2gbub4amnuWO8cXX3dM4bRQiNJT4tqxj7myvvxJcD9H4irQAhowPYo4nGLohfcZCkP2CLxwqj-CVw51x1sdU_fepl4LBhKrxBhnPK9_bSCoqLuPFaqxxioK9DvmdMIf-HFzKtFs36C32UIGfiIrWPEmwQ==
- Goのビルドシステムに関する情報 (Vertex AI Search): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGDt0vDKtzT4isWoq6cZQdMmoN4z4oj2bxx9vOUdCv156M5KSGbjKqN60pAWwbVP43xFvq2EchmXa06cPho4Ia3VtQmC7TZ0Tc-qB4YdK_dUR7lswsLypldQ==