ただの技術メモ

個人備忘録

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.

pkg.go.dev

buildやrunにはworkというオプションがあり、これを渡すとtempディレクトリをプリントしてくれるようです。

print the name of the temporary work directory and do not delete it when exiting.

pkg.go.dev

これで挙動を追ってみます。

  • まず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

これを実行しているんだ!と思いスッキリしました!!!

参考

maori.geek.nz