これは、なにをしたくて書いたもの?
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
フラグがあるようです。
ちょっと覚えておきましょう。