2014-02-26 37 views
2

我有一个去应用程序,它非常依赖静态资源,如图像和罐子。我想安装可执行文件在不同的平台,如Linux,Mac和Windows。分发可执行的有效方式

  • 我使用https://github.com/jteeuwen/go-bindata捆绑的资源的第一个念头,但是由于文件(〜100)有大小大约20MB的左右,它需要一个很长的时间来建立可执行文件。我认为有一个单一的可执行文件是人们下载可执行文件并运行它的简单方法。但似乎这不是一个有效的方法。

  • 然后我想为每个平台编写一个安装包,比如创建一个.rpm或.deb包?因此,这些软件包包含所有资源并将其放入特定平台的预定义位置,并且go可执行文件可以引用它们。但唯一的是我必须在转码中处理这个问题。我必须看看它是否是windows,然后从c:\ go-installs加载文件,或者如果是linux,则从/ usr/local/share/go-installs加载文件。我希望代码能够像平台一样不可知。

或者还有其他一些策略吗?

谢谢

回答

1

可能没有资格作为真正的答案,但仍然......“

  • 至于你点№2,来处理这一种方法是利用Go's way to do conditional compilation:您可以创建一组文件像res_linux.gores_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/myappFHS(或particular distro's rules)指定的类似位置下,因此仍需要一些用于查找该文件的逻辑。

总而言之,如果这应该是一件FOSS,我会用第一方案去让下游打包调整的路径名。如果这是一个专有软件(或者仅仅是小众软件),那么第二个想法似乎是相当不错的,因为你将自己扮演下游打包商的角色。