go runで実行しているはずのバイナリはどこにあるのか
go buildはコンパイルしてバイナリを作成してくれて、go runはバイナリの実行まで行ってくれます。
が、よくよく考えてみるとgo runを実行しても作成したバイナリはgo buildで作成されるバイナリのようにカレントディレクトリには存在しないですよね。
どこで作成されてどういう動きをしているのか気になったので少し追ってみます。
おさらいですが、go buildはimport pathで指定されたパッケージとその依存関係をコンパイルします。このとき_test.go
は無視されるようです。
以下、ドキュメントです。
Build compiles the packages named by the import paths, along with their dependencies, but it does not install the results.
buildやrunにはworkというオプションがあり、これを渡すとtempディレクトリをプリントしてくれるようです。
print the name of the temporary work directory and do not delete it when exiting.
これで挙動を追ってみます。
- まず
go build -work main.go
を実行してみると
いつも通りカレントディレクトリにバイナリが作成され、標準出力にディレクトリがプリントされます。
WORK=/var/folders/h6/ktrh43ln16vgzcytn6s_02840000gn/T/go-build3292432943
そこでこのディレクトリに移動して、treeコマンドを打つと、
$ cd /var/folders/h6/ktrh43ln16vgzcytn6s_02840000gn/T/go-build3292432943 $ tree
以下のような結果が得られます。
. └── b001 ├── exe └── importcfg.link 2 directories, 1 file
何やらexeというディレクトリがありますが、中身は空です。
- 次に
go build -work main.go
を実行してみると
同じように標準出力にディレクトリがプリントされます。
WORK=/var/folders/h6/ktrh43ln16vgzcytn6s_02840000gn/T/go-build1380454453
同じように移動して、treeコマンドを打つと、
$ cd /var/folders/h6/ktrh43ln16vgzcytn6s_02840000gn/T/go-build1380454453 $ tree
以下のようにexeディレクトリの中にmainというバイナリがあります。
. └── b001 ├── exe │ └── main └── importcfg.link
これを実行しているんだ!と思いスッキリしました!!!