File path in golang

huangapple go评论79阅读模式
英文:

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
}

huangapple
  • 本文由 发表于 2016年4月5日 16:22:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/36420863.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定