为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 项目中组织资产文件

在 Go 项目中组织资产文件

Go
斯蒂芬大帝 2021-06-15 14:09:03
我有一个项目,其中包含一个用于管理文件模板的文件夹,但 Go 似乎没有为非 Go 代码项目文件提供任何支持。项目本身编译为可执行文件,但它需要知道此模板文件夹的位置才能正确运行。现在我搜索 $GOPATH/src/<templates>/templates,但这对我来说有点像黑客,因为如果我决定重命名包或将它托管在其他地方,它会中断。我已经进行了一些搜索,看起来很多人对能够通过将资产文件嵌入到最终二进制文件中来“编译”资产文件感兴趣,但我不确定我对这种方法的看法。有任何想法吗?
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

选择一个路径(或路径列表),用户希望将支持数据放在 (/usr/local/share/myapp, ...) 中,或者只是将其编译为二进制文件。

这取决于您计划如何分发该程序。作为包裹?用安装程序?

我的大多数程序我都喜欢只部署一个文件,而且我只需要包含几个模板,所以我这样做了。

我有一个使用go-bindata的示例,其中我使用 Makefile 构建 html 模板,但是如果我使用 'devel' 标志构建,它将在运行时读取文件而不是使开发更容易。


查看完整回答
反对 回复 2021-06-21
?
天涯尽头无女友

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 标志覆盖了这一点。


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信