英文:
File path in golang
问题
我有一个具有以下结构的项目:
|_main.go
|_config
|_config.go
|_config_test.go
|_config.json
在config.go
中,我有以下代码行:
file, _ := os.Open("config/config.json")
当我从main.go
中执行包含此代码行的方法时,一切正常。但是,当我尝试从config_test.go
中执行此方法时,会产生错误:
open config/config.json: no such file or directory
据我所了解,这是一个工作目录的问题,因为我从不同的目录中使用相对路径启动相同的代码。如何在config.go
中修复此问题而不使用完整路径?
英文:
I have a project with next structure:
|_main.go
|_config
|_config.go
|_config_test.go
|_config.json
I'm having next code line in config.go
:
file, _ := os.Open("config/config.json")
When I'm executing method contained this code line from main.go
all is working. But when I'm trying to execute this method from config_test.go
it produces error:
open config/config.json: no such file or directory
As I understood it is a working directory issue because I'm launching same code with relative path from different directories. How can I fix this problem without using full path in config.go
?
答案1
得分: 5
相对路径总是基于当前目录解析的。因此最好避免使用相对路径。
可以使用命令行标志或配置管理工具(更好的方法),例如Viper。
此外,根据《The Twelve-Factor App》的要求,配置文件应该放在项目之外。
使用Viper的示例用法:
import "github.com/spf13/viper"
func init() {
viper.SetConfigName("config")
// 配置文件存储在这里;可以添加多个位置
viper.AddConfigPath("$HOME/configs")
errViper := viper.ReadInConfig()
if errViper != nil {
panic(errViper)
}
// 从config.json获取值
val := viper.GetString("some_key")
// 使用该值
}
英文:
Relative paths are always resolved basis your current directory. Hence it's better to avoid relative paths.
Use command line flags or a configuration management tool (better approach) like Viper
Also according to The Twelve-Factor App your config files should be outside your project.
Eg usage with Viper:
import "github.com/spf13/viper"
func init() {
viper.SetConfigName("config")
// Config files are stored here; multiple locations can be added
viper.AddConfigPath("$HOME/configs")
errViper := viper.ReadInConfig()
if errViper != nil {
panic(errViper)
}
// Get values from config.json
val := viper.GetString("some_key")
// Use the value
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论