让我们假设运行go install -v importpath
构建可执行文件并将其安装到$GOPATH/bin/program
中。 go
工具无法安装资源文件。当我运行program
时,我希望它能够访问$GOPATH/src/importpath
下的一些资源文件。
从已安装的可执行文件中访问此类资源文件的最佳方法是什么?
答案 0 :(得分:7)
这个问题在go-nuts邮件列表中被问到multiple times。 go
工具目前不提供直接分发其他资源的方法。但是,有两种解决方法可供使用:
编写一个简单的脚本(awk应该足够)将任何文件转换为.go
文件,该文件只包含一个字符串常量并将文件直接嵌入到二进制文件中。例如,Camlistore项目使用此方法(camlistored/ui/fileembed.go)。 go-bindata做了类似的事情。
go-tour和许多其他项目目前正在使用go/build
包的Import功能来搜索src/
和$GOPATH
中列出的所有$GOROOT
个文件夹{1}}找到包源的正确路径。示例:http://code.google.com/p/go-tour/source/browse/gotour/local.go?r=996704f8ef9e63949b3bc4d94b613ec4a7b5d99a#53
答案 1 :(得分:1)
go install并不是为了做你想做的事。
如果您坚持使用go install,则可以将资源嵌入可执行文件中(源代码中的字节数组)。
另一种选择是使用运行go install的部署脚本,然后将资源复制到可执行文件已知的位置。
如果您希望您的程序可由您以外的人安装,则应使用您所针对的操作系统标准的打包系统(例如Linux上的apt / rpm,Windows上的安装程序可执行文件,.dmg文件在Mac等。)
答案 2 :(得分:0)
在Unix上,该值是以冒号分隔的字符串。在Windows上,值 是一个以分号分隔的字符串。在计划9中,值是一个列表。
因此,$GOPATH/bin/program
和$GOPATH/src/importpath
不一定有效。例如,在Linux上,
$ GOPATH=$HOME/gopath:$HOME/go
$ cd $GOPATH/bin/go
bash: cd: /home/peter/gopath:/home/peter/go/bin/go: No such file or directory