go generate中に探索ディレクトリの構造を変化させるとエラーになる
Go のコード生成機能 go generate を実行している途中で指定ディレクトリの配下の構造が変化するとファイルが開けないというエラーが起こることがある。エラーメッセージとしては下記のようになる。 code:sh
pattern ./...: open xxxxx: no such file or directory
pattern ./...: stat xxxxx: no such file or directory
PoC
適当なディレクトリで go mod init して再現に必要なファイルを用意する
code:sh
# 作業用ディレクトリを作る
mkdir path/to/dir
cd path/to/dir
# go mod init する
go mod init example.test/x
echo -e '//go:generate true\npackage main\\n\\nfunc main() {}' > main.go
# 空のディレクトリを1つ作っておく
mkdir x
再現手順
code:sh
# ディレクトリ構造を無限に書き換え続ける
bash -c 'while true; do mv x y; mv y x; done' &
# go generate を無限に実行し続けるがエラーになる
bash -e -c 'while true; do go generate ./...; echo -n "."; done'
対策
探索対象のディレクトリが限定できる場合は go generate で探索する対象のディレクトリを限定すると良い
code:sh
# ディレクトリをもう一つ用意してファイルを置く
mkdir z
echo -e 'package main\\n\\nfunc main() {}' > z/main.go
# ディレクトリ構造を無限に書き換え続ける
bash -c 'while true; do mv x y; mv y x; done' &
# go generate を無限に実行し続けてもエラーにならない
bash -e -c 'while true; do go generate ./z/...; echo -n "."; done'
この場合は go generate は z の配下しか見に行かないので x や y が途中で消えてもエラーにならない
関連