在Go项目中组织资产文件

时间:2013-07-09 18:31:56

标签: go project

我有一个包含管理文件模板的文件夹的项目,但它看起来不像Go为非Go代码项目文件提供任何支持。项目本身编译为可执行文件,但它需要知道此模板文件夹的位置才能正常运行。现在我搜索$ GOPATH / src /< templates> / templates,但这对我来说就像是一种破解,因为如果我决定重命名包或将其托管在其他地方,它会破坏。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

我使用an example使用go-bindata我使用Makefile构建html模板,但如果我使用'devel'标记构建它将read the file at runtime而不是使开发更容易。< / p>

答案 1 :(得分:1)

我可以考虑两个选项,使用cwd标志,或从cwd和arg 0推断:

-cwd path / to / assets

path/to/exe -cwd=$(path/to/exe/assets)

在内部,exwable会在cwd指向的地方进行chdir,然后它可以在整个应用程序中使用相对路径。这具有额外的好处,即用户可以在不必重新编译程序的情况下更改资产。

我为配置文件执行此操作。基本上顺序是:

  • 处理cmd参数,查找-cwd变量(默认为空)
  • chdir to -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标志覆盖了这一点。