x…motemen/ghqを写経している時、 go run main.go 出来ないことに気付いた。 下記が実行時のエラーになる。ちなみに、 go build は出来る。

1
2
3
4
~/d/s/g/x/ghq  >>> go run main.go
# command-line-arguments
./main.go:38:17: undefined: commands
~/d/s/g/x/ghq  >>>

commands が見つからない?同じ階層の commands.go には下記記述がちゃんとあるのに、どうして見つからない…。

1
2
3
4
5
6
var commands = []*cli.Command{
	commandGet,
	commandList,
	commandRoot,
	commandCreate,
}

理由は、go runの引数に指定したファイル(+ importされるパッケージ)しか読み込まないから。

実際、go run main.go commands.goに変更すると上記エラーは解消される…が、別のエラーとなる。 今度は違うのが見つからないって言われる。

1
2
3
4
5
6
~/d/s/g/x/ghq master >>> go run main.go commands.go
# command-line-arguments
./commands.go:25:10: undefined: doGet
./commands.go:50:10: undefined: doList
./commands.go:62:10: undefined: doRoot
./commands.go:71:10: undefined: doCreate

同じ階層で必要なファイルを引数に全て指定すればいいのだけど、そんなことはしたくない。 正規表現で指定してもいいけど、_test.goがあるとgo runで実行出来ないってエラーになる。

1
2
~/d/s/g/x/ghq master >>> go run *.go
go run: cannot run *_test.go files (cmd_create_test.go)

正規表現(?!._test).goでファイル指定も出来ない。shellには書きたくない。

どうすれば…答えは go run .

1
2
3
4
~/d/s/g/x/ghq master >>> go run .
NAME:
   ghq - Manage remote repository clones
...

パッとググっても複数ファイル指定の記事ばかり出てきたし、下記stackoverflowのvote数も低かったので迷った…

stackoverflow: go build works fine but go run fails