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

[インデックス 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 getgo mod tidy などのコマンドが提供されています。

このコミットが行われた2012年時点では、Go Modulesは存在せず、Goのビルドシステムはまだ発展途上にありました。deps.bash の削除は、Goのビルドシステムがより洗練され、内部的な依存関係解決のメカニズムが変更された結果と考えられます。

技術的詳細

deps.bash スクリプトは、Goプロジェクトのビルドプロセスにおいて、パッケージ間の依存関係を自動的に検出・生成する役割を担っていました。スクリプトの内容を見ると、以下の処理を行っていたことがわかります。

  1. Go環境変数の設定: eval $(gomake --no-print-directory -f ../Make.inc go-env) を使用して、Goのビルドに必要な環境変数(GOOS, GOARCH など)を設定しています。
  2. ディレクトリリストの取得: gomake --no-print-directory echo-dirs を実行して、ビルド対象となるディレクトリのリストを取得しています。
  3. Make.deps ファイルの生成: OUT="Make.deps"TMP="Make.deps.tmp" から、Make.deps という名前のファイルに依存関係情報を出力していたことがわかります。
  4. ソースファイルの特定: 各ディレクトリ内で Makefile を解析し、Goのソースファイル(.go)を特定しています。sed コマンドを使って Makefile からソースファイル名を抽出し、$(GOOS)$(GOARCH) といった変数を展開しています。
  5. インポートパスの抽出: sed -n '/^import.*\"/p; /^import[ \\t]*(/,/^)/p' $sources /dev/null | cut -d '\"' -f2 の部分で、Goのソースコードから import 文を抽出し、インポートされているパッケージのパスを特定しています。
  6. 依存関係のフィルタリングと整形: 抽出されたインポートパスを awkgrepsedsort -u を使ってフィルタリングし、dir.install: deps の形式で Make.deps に書き出しています。これは make コマンドが依存関係を解決するために使用する形式です。
  7. exp または old パッケージへの依存チェック: 最後に、生成された Make.deps ファイルに exp または old パッケージへの依存関係が含まれていないかを egrep でチェックし、もし含まれていればエラーとして終了しています。これは、実験的または古いパッケージへの意図しない依存を防ぐための品質チェックと考えられます。

このスクリプトが「もはや機能しない」とされた理由はいくつか考えられます。

  • Goビルドシステムの変更: Goのビルドシステム自体が進化し、Makefile の構造や依存関係の解決方法が変更されたため、deps.bash が想定していた入力や出力の形式が合わなくなった可能性があります。
  • Goツールの統合: go build コマンドが内部的に依存関係解決をより効率的に行うようになったため、このような外部スクリプトが不要になった。
  • Go言語の構文変更: Go言語自体の構文変更(特に import 文の扱いなど)があった場合、sedcut を使った解析ロジックが正しく機能しなくなった可能性も考えられます。

いずれにせよ、このスクリプトが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 に書き込まれていました。また、expold といった特定のパッケージへの依存がないかを確認するチェックも含まれていました。

このスクリプトが削除されたということは、Goのビルドシステムが、このような手動(スクリプトによる)の依存関係解析と Makefile への出力に依存しなくなったことを意味します。おそらく、Goのコンパイラやビルドツール自体が、より高度な依存関係解決機能を内部的に持つようになったか、あるいはビルドプロセスの全体的な設計が変更され、このスクリプトの役割が他のメカニズムに置き換えられたと考えられます。

関連リンク

参考にした情報源リンク