質問: ### 前提・実現したいこと Goでスクリプトを作成しています。 実行ファイルのパスを取得するためにos.Executable()を使っていますが、 コンパイル後の実行ファイルとgo runコマンドで実行した場合で取得できるパスが違って困っています。 ### 発生している問題・エラーメッセージ 実行ファイルではそのファイルへのパスが取得できる。 go runで実行した場合は以下のようにvar配下のディレクトリへのパスが出る。 ``` /var/folders/n9/t3cdhscn79j1ksxjy50td_540000gp/T/go-build211000199/b001/exe ``` ### 該当のソースコード ``` func main() { exe, err := os.Executable() if err != nil { fmt.Println(err) } fmt.Println(filepath.Dir(exe)) } ``` ### 補足情報(FW/ツールのバージョンなど) 実行OS : OSX(Mojave) Goバージョン : go version go1.10.3 darwin/amd64
回答: 「go run」は一時的にテンポラリ領域にバイナリを生成して実行するコマンドであり、実運用時とは異なる環境下で動作する簡易実行コマンドです。 ビルド結果と挙動の違いが問題なのであれば「go run」の利用をやめましょう。例えば「go build」してエラーがなければバイナリを起動するというようにしましょう。 例「go build -o app <メインパッケージパス> && ./app」といったシェルコマンドで動作確認をしましょう。 * os.Getwd() ワーキングディレクトリ(カレントフォルダ)の取得 * os.Executable() 実行ファイル(自分自身)パスの取得 それぞれ関数名の通りの機能ですので、目的に応じて使い分けましょう。 もちろん成果物バイナリの置いてあるフォルダをカレントフォルダに切り替えてから起動する運用であればos.Getwdで良いと思いますし、「go run」による起動でも問題にならないでしょう。 カレントフォルダがどこを指しているか不定の状態で運用するようなバイナリであればos.Executableを利用することになると思います。