タイトルでほとんど説明しましたが、Go Modulesが有効な環境で、module-awareなコマンドに特定のディレクトリを無視させるには、無視させたいディレクトリにダミーのgo.mod
ファイルを設置しておくとよいです。ファイルの内容は空で構いません。
Githubにサンプルコードを置いておいたので、参考にしてください。
解説
パッケージパターンを引数として受け取るgo
コマンドのサブコマンドを使うとき、...
というワイルドカードを使うと、特定のディレクトリツリー内のパッケージをまとめて指定できて便利です。
例えば
$ go generate ./...
というコマンドは、カレントディレクトリ(.
)以下のすべてのパッケージを対象にしてgo generate
コマンドを実行します。
これはパッケージがたくさんある場合にひとつずつ指定せずに済むので便利なのですが、この方法だとgo
コマンドがすべてのディレクトリツリーを走査してしまうので、実行に時間がかかる場合があります。
例えば、GoとNode.jsのソースコードが同居しているコードベースがあったとき、node_modules
ディレクトリにはGoのソースコードは含まれていないので、go
コマンドがこのようなディレクトリを見ないようにできると、パフォーマンス上のメリットがあります。
go
コマンドは_
または.
から始まるディレクトリや、testdata
というディレクトリは無視する*1ので、ディレクトリをリネームできる場合はそうすればいいのですが、node_modules
のようにディレクトリ名を制御できないこともあります。
これに対処するには、ダミーのgo.mod
ファイルを当該ディレクトリに設置し、go
コマンドにそのディレクトリ以下を別のモジュールとして認識させるという方法が使えます。
個人的には筋の良い解決策とは思えないのですが、Goチームとしてはgo
コマンドに特定のディレクトリを無視する機能を追加する予定はないようです*2。
node_modules
を無視したい場合はpostinstall
スクリプトを使う
一般にnode_modules
ディレクトリはバージョン管理システムで管理されないため、go.mod
ファイルが必ずnode_modules
に配置されるようにするには一工夫必要です。
ワークアラウンドとしては、package.json
のpostinstall
スクリプトに空のgo.mod
ファイルを作成するようなスクリプトを指定するとよいでしょう(とりあえずnode_modules
生成後に自動でgo.mod
を配置するという用途にはこれで十分ではあるものの、GoのツールチェインのためのファイルをNode.jsの仕組みで生成させるのはいかがなものか……とも思いますが)。