我有一个go应用程序,它严重依赖静态资源,如图像和jar。我想在linux,mac和windows等不同平台上安装该可执行文件。
我首先考虑使用https://github.com/jteeuwen/go-bindata捆绑资源,但由于文件(~100)大小约为20MB左右,因此构建可执行文件需要很长时间。我认为拥有一个可执行文件是人们下载可执行文件并运行它的简单方法。但似乎这不是一种有效的方式。
然后我考虑为每个平台编写一个安装包,比如创建.rpm或.deb包?因此,这些包包含所有资源并将其放入某些特定于平台的预定义位置,并且go可执行文件可以引用它们。但唯一的问题是我必须在go代码中处理它。我必须看看它是否是Windows然后从说c:\ go-installs加载文件或如果它是linux然后加载来自/ usr / local / share / go-installs的文件。我希望go代码尽可能与平台无关。
或者还有其他策略吗?
谢谢
答案 0 :(得分:1)
可能不符合真正的答案,但仍然......
关于你的观点№2,解决这个问题的一种方法是利用Go's way to do conditional compilation:你可以创建一组文件,如res_linux.go
,res_windows.go
等,并放置一个每组中相同的变量,指向不同的位置,如
var InstallsPath = `C:\go-installs`
<{1>}和中的
res_windows.go
var InstallsPath = `/usr/share/myapp`
中的等等。然后在程序的其余部分中引用res_linux.go
变量并使用path/filepath
包构建实际资源的完整路径名。
当然,另一种方法是在runtime.GOOS
变量上进行运行时切换 - 可能在其中一个源文件的res.InstallsPath
函数中。
将所有内容打包到init()
存档中,并使用archive/zip
从中读取资源文件。这样你就不得不分发两个文件 - 几乎“xcopy部署”。
请注意,在Windows上,您可以让您的可执行文件从其自身的路径名(zip
)中提取目录,并假设资源文件位于POSIX平台(GNU / Linux和*)上的同一目录中BSD等)资源文件仍应位于os.Args[0]
或FHS(或particular distro's rules)所指示的类似位置,因此仍需要找到该文件的一些逻辑。
总而言之,如果这应该是FOSS的一部分,我将使用第一个变体让下游打包者调整路径名。如果这是一个专有(或只是利基)软件,第二个想法似乎相当不错,因为你将自己扮演下游包装商的角色。