17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

ホームディレクトリが必要になるのは、コマンドラインツールとかを作っていて、設定ファイルを保存するようなケースです。
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

17
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?