13
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

ホームディレクトリを取得するのにos/userを使うとエラーになる場合がある

ホームディレクトリが必要になるのは、コマンドラインツールとかを作っていて、設定ファイルを保存するようなケースです。
Goにはos/userパッケージがあって、一見これを使うのがセオリーのように見えるのですが、クロスコンパイルするとエラーになります。

package main

import (
    "fmt"
    "os/user"
)

func main() {
    fmt.Println(user.Current())
}

これは、私の手元のOSX環境では動きますが、Go Playgroundでは以下のようにエラーになります。

<nil> user: Current not implemented on nacl/amd64p32

Program exited.

他にも、例えばTravis CI(Ubuntu Linux)でビルドしたバイナリをOSXやWindowsで動かすと、以下のようなエラーになりました。

panic: user: Current not implemented on darwin/amd64

goroutine 1 [running]:
(中略)
main.main()
        /home/travis/gopath/src/github.com/hironobu-s/******/main.go:47 +0x71b

goroutine 2 [runnable]:
runtime.forcegchelper()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/proc.go:90
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/mgc0.go:82
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1

goroutine 4 [runnable]:
runtime.runfinq()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/malloc.go:712
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1

これはos/userパッケージがcgoに依存していて、Goでクロスコンパイルするとcgoが無効になっているからだそうです。私もあまり詳しくわかっていませんが、以下の解説を参考にしました。

Issue 6376: user.Current panic in darwin-amd64 when crosscompiled from linux-amd64

go - Cross compiling: "user: Current not implemented on linux/amd64" - Stack Overflow

そして、ホームディレクトリを取得するのには、こちらのパッケージを使わせてもらうことにしました。ありがたや。
https://github.com/mitchellh/go-homedir

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
13
Help us understand the problem. What are the problem?