ちょっとしたコマンドラインツールを作ってるときはよく go run main.go するんだけど、作業ディレクトリが main.go から離れてしまうと go run $GOPATH/src/... みたいなことをする羽目になり、ちょっとありがたくない。ファイルが増えてくると go run *.go することになるが、テストコード(*_test.go)が入ってくると go run できないので、そいつを除いてやる必要もあり面倒。
そこで go list を使ってパッケージ名からソースコードを一覧し、それを go run に渡してやる簡単なシェルスクリプトを書いた。
GitHub - motemen/gorun: Run Go programs by their package path
使い方はこんな感じ。
usage: gorun [-l] [-tags tags] packages [arguments...]
gorun github.com/motemen/ghq みたいに、main パッケージへのパスを指定すると go run 的なことをしてくれます。手元のソースコードを動かしたいなら、go run main.go の代わりに gorun . すればよい。
-l フラグをつけると go run する代わりにソースコードをリストアップしてくれるので、entr みたいなのに渡すのに便利。
実際に go run するところは
go run "${flags[@]}" -exec "bash -c 'shift; exec \"\$0\" \"\$@\"'" "${files[@]}" -- "$@"
となっているんだけど、この -exec がミソで、go run するプログラムの引数に *.go なファイルを渡したいようなときに、プログラムのソースコードとプログラムへの引数を -- によって分割する、というようなことをおこなっている。