2 回答
TA贡献1825条经验 获得超6个赞
选择一个路径(或路径列表),用户希望将支持数据放在 (/usr/local/share/myapp, ...) 中,或者只是将其编译为二进制文件。
这取决于您计划如何分发该程序。作为包裹?用安装程序?
我的大多数程序我都喜欢只部署一个文件,而且我只需要包含几个模板,所以我这样做了。
我有一个使用go-bindata的示例,其中我使用 Makefile 构建 html 模板,但是如果我使用 'devel' 标志构建,它将在运行时读取文件而不是使开发更容易。
TA贡献1831条经验 获得超9个赞
我可以想到两个选项,使用cwd
标志,或者从 cwd 和 arg 0 推断:
-cwd 路径/到/资产
path/to/exe -cwd=$(path/to/exe/assets)
在内部,exectable 将 chdir 到 cwd 指向的任何地方,然后它可以在整个应用程序中使用相对路径。这有一个额外的好处,即用户可以更改资产而无需重新编译程序。
我为配置文件执行此操作。基本上顺序是:
处理 cmd 参数,寻找 -cwd 变量(默认为空)
chdir 到 -cwd
解析配置文件
重新解析 cmd 参数,覆盖配置文件中的设置
我不确定你的应用程序有多少参数,但我发现这非常有用,特别是因为 Go 没有标准的打包工具来编译这些资产。
从 arg 0 推断
另一种选择是使用第一个参数并获取可执行文件的路径。像这样的东西:
here := path.Dir(os.Args[0]) if !path.IsAbs(os.Args[0]) { here = path.Join(os.Getwd(), here)}
这将为您提供可执行文件所在的路径。如果你保证用户不会在不移动其余资产的情况下移动它,你可以使用它,但我发现使用上面的 -cwd 想法更灵活,因为这样用户可以将可执行文件放在他们的系统,并将其指向资产。
最好的选择可能是两者的混合。如果用户没有提供 -cwd 标志,他们可能没有移动任何东西,所以从 arg 0 和 cwd 推断。cwd 标志覆盖了这一点。
- 2 回答
- 0 关注
- 164 浏览
添加回答
举报