猿问

在 Go 项目中组织资产文件

我有一个项目,其中包含一个用于管理文件模板的文件夹,但 Go 似乎没有为非 Go 代码项目文件提供任何支持。项目本身编译为可执行文件,但它需要知道此模板文件夹的位置才能正确运行。现在我搜索 $GOPATH/src/<templates>/templates,但这对我来说有点像黑客,因为如果我决定重命名包或将它托管在其他地方,它会中断。

我已经进行了一些搜索,看起来很多人对能够通过将资产文件嵌入到最终二进制文件中来“编译”资产文件感兴趣,但我不确定我对这种方法的看法。

有任何想法吗?


斯蒂芬大帝
浏览 165回答 2
2回答

胡子哥哥

选择一个路径(或路径列表),用户希望将支持数据放在 (/usr/local/share/myapp, ...) 中,或者只是将其编译为二进制文件。这取决于您计划如何分发该程序。作为包裹?用安装程序?我的大多数程序我都喜欢只部署一个文件,而且我只需要包含几个模板,所以我这样做了。我有一个使用go-bindata的示例,其中我使用 Makefile 构建 html 模板,但是如果我使用 'devel' 标志构建,它将在运行时读取文件而不是使开发更容易。

天涯尽头无女友

我可以想到两个选项,使用cwd标志,或者从 cwd 和 arg 0 推断:-cwd 路径/到/资产path/to/exe&nbsp;-cwd=$(path/to/exe/assets)在内部,exectable 将 chdir 到 cwd 指向的任何地方,然后它可以在整个应用程序中使用相对路径。这有一个额外的好处,即用户可以更改资产而无需重新编译程序。我为配置文件执行此操作。基本上顺序是:处理 cmd 参数,寻找 -cwd 变量(默认为空)chdir 到 -cwd解析配置文件重新解析 cmd 参数,覆盖配置文件中的设置我不确定你的应用程序有多少参数,但我发现这非常有用,特别是因为 Go 没有标准的打包工具来编译这些资产。从 arg 0 推断另一种选择是使用第一个参数并获取可执行文件的路径。像这样的东西:here&nbsp;:=&nbsp;path.Dir(os.Args[0]) if&nbsp;!path.IsAbs(os.Args[0])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;here&nbsp;=&nbsp;path.Join(os.Getwd(),&nbsp;here)}这将为您提供可执行文件所在的路径。如果你保证用户不会在不移动其余资产的情况下移动它,你可以使用它,但我发现使用上面的 -cwd 想法更灵活,因为这样用户可以将可执行文件放在他们的系统,并将其指向资产。最好的选择可能是两者的混合。如果用户没有提供 -cwd 标志,他们可能没有移动任何东西,所以从 arg 0 和 cwd 推断。cwd 标志覆盖了这一点。
随时随地看视频慕课网APP

相关分类

Go
我要回答