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