配置变得简单
这个包提供了一种简单的方法来处理配置。主要用于 CLI 工具。可扩展和可定制。
更多详情请参考测试
let config = Config(useEnvironment: true)
try config.load(.file(name: ".env.dev"))
// or
let url = Bundle.main.url(forResource: "myConfig", withExtension: "plist")!
try config.load(.url(url), format: .plist)
// or
let json = """
{"key": "value"}
"""
try config.load(.string(json), format: .json)
所有值都存储为 Key
-String
对。 有方便的方法来使用 LosslessStringConvertible
。
Key
代表所提供源中值的所在位置。
对于基本的键值格式,它只是一个字符串。
对于嵌套类型,键是字符串数组。
数组被映射为多个键值对
Key<arrayName, 0> = <first element>
Key<arrayName, 1> = <second element>
...
Key<arrayName, count-1> = <last element>
可以通过下标访问值
let path: String? = config["PATH"]
let port: Int? = config["HTTP_PORT"]
let key = Key("myKey")
let value = config[key]
let value = config[["key", "nested"]]
let value = config[["array", 2]]
extension Key {
static let clientId = Key("SECRET_CLIENT_ID")
}
let value = config[.clientId]
对于需要的值,可以使用 require
方法,如果未找到该值,则会抛出 ConfigurationError.missing(key:)
。
let requiredValue = try config.require("secret")
struct MyCredentials {
let username: String
let password: String
}
extension Config {
func credentials() throws -> MyCredentials {
try MyCredentials(username: require("username"),
password: require("password"))
}
}
可以通过下标更新值
config["foo"] = "bar"
config["answer"] = 42
let key: Key = "myKey"
let key: Key = 99
let key: Key = Key(23.4)
let key: Key = Key("some")
let key: Key = ["24", 72, 23.4, true]
let key: Key = Key([1, 2, 3])
Conf
可以回退到环境变量。这由构造函数中的 useEnvironment
变量控制。
可以使用 Environment
单独评估 Env 值
let env = Environment()
let home = env["HOME"]
let path = env.PATH
env.TMPDIR = "/tmp"
如果要添加对不同配置格式的支持,只需实现自己的解析器函数,并使用 Format.custom
调用 load
。
例如,以下是如何使用 Yams 添加 yaml
支持的示例
let yamlParser: ParserType = { data in
guard let rawYaml = String(data: data, encoding: .utf8),
let values = try Yams.load(yaml: rawYaml) as? [String: Any]
else {
struct InvalidYaml: Error {}
throw InvalidYaml()
}
return values
}
try config.load(.file(name: "config.yml"), format: .custom(yamlParser))
也可以提供数据获取行为的完全自定义实现。 为此,您需要采用 ConfigurationProvider
struct CustomConfigurationProvider: ConfigurationProvider {
func configuration() throws -> [Key : String] {
return ["key": "value"]
}
}
config.load(from: CustomConfigurationProvider())