Go 从已执行的bin读取配置

Go 从已执行的bin读取配置,go,bin,Go,Bin,我正在使用go viper读取我的repo中的config文件 myrepo -config.yaml -main.go 我使用以下代码 viper.SetConfigName("config") viper.AddConfigPath(".") viper.SetConfigType("yaml") err := viper.ReadInConfig() 现在我把它编译成二进制,现在我从 不同路径(运行垃圾箱)和我得到的错误,配置没有找到,这里可能有什么问题 文件就在那里,如果我在调试

我正在使用go viper读取我的repo中的
config
文件

myrepo
 -config.yaml
 -main.go
我使用以下代码

viper.SetConfigName("config")
viper.AddConfigPath(".")
viper.SetConfigType("yaml")
err := viper.ReadInConfig()
现在我把它编译成二进制,现在我从 不同路径(运行垃圾箱)和我得到的错误,配置没有找到,这里可能有什么问题


文件就在那里,如果我在调试中使用
ioutil.ReadFile
,我会得到它,但不是从可执行文件中得到的…

所以你告诉viper它可以从
/config.yaml
位置读取配置。编译项目时,编译器不会使用二进制文件编译
config.yaml
中的配置数据。因此,每次二进制文件运行时,它都会查找一个文件
/config.yaml


所以你在这里几乎没有选择。或者将配置文件与二进制文件一起移动,并确保在复制二进制文件时也复制了配置文件。另一个选项是设置一个标志“configpath”,将配置路径传递给该标志,viper应该读取该标志并获取配置。另一种选择是将配置文件放入.go文件中,然后以这种方式编译配置文件(但我猜这是您不想要的)

所以您告诉viper它可以从
/config.yaml
位置读取配置文件。编译项目时,编译器不会使用二进制文件编译
config.yaml
中的配置数据。因此,每次二进制文件运行时,它都会查找一个文件
/config.yaml


所以你在这里几乎没有选择。或者将配置文件与二进制文件一起移动,并确保在复制二进制文件时也复制了配置文件。另一个选项是设置一个标志“configpath”,将配置路径传递给该标志,viper应该读取该标志并获取配置。另一种选择是将配置文件放在.go文件中,这样就可以编译配置文件(但我猜这是您不想要的)

您故意让viper只查看当前工作目录。如果config.yaml不存在,则无法读取。“你需要把你的逻辑弄清楚。”沃尔克-你什么意思?如果我创建了一些go项目(不是cli)并像我在问题“它工作”中所做的那样放置配置,那么问题是二进制文件无法访问作为二进制文件一部分的yaml文件,这看起来有点复杂。为什么您认为yaml文件是二进制文件的一部分?事实并非如此。您编译的二进制文件就是您的二进制文件,config.yaml与该二进制文件完全无关。请不要硬编码,并将路径而不是当前目录传递给它。您故意让viper只查看当前工作目录。如果config.yaml不存在,则无法读取。“你需要把你的逻辑弄清楚。”沃尔克-你什么意思?如果我创建了一些go项目(不是cli)并像我在问题“它工作”中所做的那样放置配置,那么问题是二进制文件无法访问作为二进制文件一部分的yaml文件,这看起来有点复杂。为什么您认为yaml文件是二进制文件的一部分?事实并非如此。您编译的二进制文件就是您的二进制文件,config.yaml与该二进制文件完全无关。请不要硬编码,并将路径而不是当前目录传递给它