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