Conf

配置变得简单

CI Tag

这个包提供了一种简单的方法来处理配置。主要用于 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())

待办事项