3

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

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

有任何想法吗?

4

2 回答 2

2

要么选择一个路径(或路径列表),用户应该将支持数据放入(/usr/local/share/myapp,...),或者只是将其编译到二进制文件中。

这取决于您计划如何分发该程序。作为一个包?有安装程序吗?

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

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

于 2013-07-09T20:03:25.587 回答
1

我可以想到两个选项,使用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 标志会覆盖它。

于 2013-07-10T00:13:39.200 回答