ちょっとしたコマンドラインツールを作ってるときはよく 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
なファイルを渡したいようなときに、プログラムのソースコードとプログラムへの引数を --
によって分割する、というようなことをおこなっている。