CLOVER🍀

That was when it all began.

Goのビルドやテスト結果のキャッシュをクリアする

これは、なにをしたくて書いたもの?

Goでテストを動かしたりしていると、こんな感じでcachedと表示されたりします。

$ go test ./...
ok      xxxx    (cached)

テスト結果がキャッシュされているようです。

これについて、ちょっと調べてみました。

環境

今回の環境は、こちら。

$ go version
go version go1.16 linux/amd64

Goのビルドやテスト結果のキャッシュ

Goでは、ビルドやテストの結果をキャッシュしているようです。

Command go / Build and test caching

ビルドキャッシュについては、通常は自分でクリアする必要はないみたいです。Cまわりの環境に変化があった時くらい、みたい
ですね。

cleaning the cache explicitly should not be necessary in typical use. However, the build cache does not detect changes to C libraries imported with cgo.

キャッシュの保存場所は、$GOCACHE環境変数に設定されています。

$ go env GOCACHE
$HOME/.cache/go-build

中身は、こんな感じですね(10件のみ表示)。

$ find $HOME/.cache/go-build -type f | head -n 10
$HOME/.cache/go-build/e1/e171ad3b27fad13f49bc4ee36158ca2bde38ab7f7b6cce3136039518c4560266-d
$HOME/.cache/go-build/3c/3c38e5c61a9653dc3e02b22e346b99778ac8b4e38102bfc239b4d3ac5c37efc4-a
$HOME/.cache/go-build/3c/3c39fb6f2e25e31016c87c0e962794c31efbc30d0a2101d93cc68557ca9b407b-a
$HOME/.cache/go-build/3c/3c3b03bfc830fae31e983f80a91ff876d985cd8899801293a5500652e092e7a5-d
$HOME/.cache/go-build/3c/3c6d259f1b291feaa780c910c133e162f9a37ee43a2421baab750f4e820c4c43-d
$HOME/.cache/go-build/7a/7a77e290122e0eefa745c9d7ba40d3c9601fcac50a5466886a6312dbe57f4a37-a
$HOME/.cache/go-build/7a/7a4c147c38b00b3ee9b20a12de654e4d4a9a29f3ba476550ca9b75afaeda0abc-d
$HOME/.cache/go-build/7a/7a885fb5506eea4d072107aad418c9473e0c6467755b27f0b1100240c5b4d96a-a
$HOME/.cache/go-build/cb/cbbb9be7d39b9faae329ae524b5da73774af20c8be1ec7d4af22cd56a1e62d8e-a
$HOME/.cache/go-build/cb/cb9b182f45f21110a69f4b445a5bf0d3655a0bbfe2af8a4f9199714e4bc4e191-a

ビルドキャッシュは気にすることはないかもしれませんが、テスト結果のキャッシュについてはクリアして再実行、みたいなことが
したくなるかもしれません。

キャッシュのクリア方法について

キャッシュのクリア方法は、こちらに記載があります。

Command go / / Remove object files and cached files

go cleanを使うようです。フラグを指定して実行します。

The -i flag causes clean to remove the corresponding installed archive or binary (what 'go install' would create).

The -n flag causes clean to print the remove commands it would execute, but not run them.

The -r flag causes clean to be applied recursively to all the dependencies of the packages named by the import paths.

The -x flag causes clean to print remove commands as it executes them.

The -cache flag causes clean to remove the entire go build cache.

The -testcache flag causes clean to expire all test results in the go build cache.

The -modcache flag causes clean to remove the entire module download cache, including unpacked source code of versioned dependencies.

テスト結果のキャッシュをクリアする場合は、-testcacheフラグを使います。

$ go clean -testcache

ビルドキャッシュをクリアする場合は、-cacheフラグを使います。

$ go clean -cache

両方指定しても構いません。

$ go clean -cache -testcache

ビルドのキャッシュをクリアすると、一気に遅くなりますね…。まあ、最初だけですけど。

-modcacheでは、ダウンロードしたモジュールの削除をします。

-nフラグを使うことで、実際に削除は行わずにどんなコマンドが実行されるかを表示できます。

たとえば、新しいモジュールを作って

$ go mod init sample
go: creating new go.mod: module sample

-nフラグのみでgo cleanを実行した場合。自モジュール内のファイルを対象とするようです。

$ go clean -n
cd /path/to/sample
rm -f sample.test sample.test.exe ..test ..test.exe

go cleanの説明にある、こちらのことですね。

_obj/            old object directory, left from Makefiles
_test/           old test directory, left from Makefiles
_testmain.go     old gotest file, left from Makefiles
test.out         old test log, left from Makefiles
build.out        old test log, left from Makefiles
*.[568ao]        object files, left from Makefiles

DIR(.exe)        from go build
DIR.test(.exe)   from go test -c
MAINFILE(.exe)   from go build MAINFILE.go
*.so             from SWIG

-cacheフラグと組み合わせると、$GOCACHE内のディレクトリに対する削除コマンドが表示されます(大量に)。

$ go clean -cache -n

この他にも、go installでインストールしたバイナリ等を削除する-iフラグ、importで指定したパッケージとその依存関係を
再帰的に削除する-rフラグ、削除時にコマンドも表示する-xフラグがあるようです。

ちょっと覚えておきましょう。