Configuration
是一个 Swift 包,用于管理应用程序配置。 使用 Configuration
,应用程序可以轻松地从多个来源加载和合并配置数据,并从一个中央配置存储库访问它们。
Configuration
支持将配置键作为路径。 也就是说,键是以 [父级]<分隔符>[子级]
语法编写的合格路径选择器。 这允许应用程序检索任何特定级别的配置对象。
最新版本的 Configuration
(v3.x.x) 在 Swift 5.2 及更高版本上运行,支持 macOS 和 Ubuntu Linux。
将 Configuration
添加到应用程序 Package.swift
文件中的依赖项。 将 "x.x.x"
替换为最新的 Configuration
版本。
.package(url: "https://github.com/Kitura/Configuration.git", from: "x.x.x")
将 Configuration
添加到你的目标的依赖项中
.target(name: "example", dependencies: ["Configuration"]),
Configuration
包的核心是 ConfigurationManager
类。 要管理应用程序的配置,首先要创建 ConfigurationManager
类的一个实例。
import Configuration
let manager = ConfigurationManager()
使用 ConfigurationManager
实例,可以加载和检索配置
manager.load(file: "config.json").load(.environmentVariables)
let value = manager["path:to:configuration:value"]
Configuration
有很多方法可以加载配置数据。
注意: 在所有情况下,配置键路径都区分大小写。
manager.load([
"hello": "world",
"foo": [
"bar": "baz"
]
])
manager.load(.commandLineArguments)
要在运行时通过命令行注入配置,请在启动可执行文件时设置配置值,如下所示
./myApp --path.to.configuration=value
在实例化 ConfigurationManager
时,您可以设置你喜欢的参数前缀(默认为 --
)和路径分隔符(默认为 .
)字符串。
manager.load(.environmentVariables)
然后,要在你的应用程序中使用它,请设置环境变量,如下所示
PATH__TO__CONFIGURATION=value
在实例化 ConfigurationManager
时,您可以设置你喜欢的路径分隔符(默认为 __
)字符串。
let data = Data(...)
manager.load(data: data)
manager.load(file: "/path/to/file")
默认情况下,file
参数是相对于可执行文件位置的路径(即,.build/debug/myApp
);如果 file
是绝对路径,那么它将被视为绝对路径。 您可以使用可选的 relativeFrom
参数更改相对路径的起始位置,如下所示
// Resolve path against PWD
manager.load(file: "../path/to/file", relativeFrom: .pwd)
// or
// Resolve path against a custom path
manager.load(file: "../path/to/file", relativeFrom: .customPath("/path/to/somewhere/on/file/system"))
注意: 如果应用程序是从 Xcode 内部运行的,则以下 relativeFrom
选项,.executable
(默认)和 .pwd
,将引用不同的文件系统位置,如果应用程序是从命令行运行的,则也是如此。 您可以在你的 xcodeproj
中设置一个编译器标志,例如 -DXCODE
,并使用该标志来更改你的配置文件加载逻辑。
注意: 因为 BasePath.project
取决于可执行文件的父文件夹中的某个位置是否存在 Package.swift
文件,所以不支持使用 swift build --build-path
更改其位置。
let url = URL(...)
manager.load(url: url)
注意: URL
必须包含一个方案,即 file://
、http://
等。
您可以链接这些方法来一次性从多个来源加载配置数据。 如果同一配置键存在于多个来源中,则最近加载的配置键将覆盖较早加载的配置键。 在这个简单的例子中,
manager.load(["foo": "bar"]).load(["foo": "baz"])
foo
的值现在是 baz
,因为 ["foo": "baz"]
比 ["foo": "bar"]
更晚加载。 同样的行为适用于所有其他的 load
函数。
注意: 目前,Configuration
仅支持从 Data
、文件或 URL
加载的资源的 JSON 和 PLIST 格式。 您可以编写一个 自定义反序列化器 来解析其他格式。
要在加载配置值之后获取单个配置值,请使用
manager["path:to:configuration"]
配置存储库表示为一棵树,其中键中的路径元素由冒号 (:
) 分隔。 例如,键 VCAP_SERVICES:cloudantNoSQLDB:0:credentials:host
将遍历到 VCAP_SERVICES
、cloudantNoSQLDB
、数组索引 0、credentials
,然后是 host
以获取值。 这是一个 JSON 示例,展示了该结构
{
"VCAP_SERVICES": {
"cloudantNoSQLDB": [
{
"credentials": {
"host": <value-goes-here>
}
}
]
}
}
返回的值类型为 Any?
。 因此,将该值转换为你想使用的类型非常重要。 例如
let stringValue = manager["VCAP_SERVICES:cloudantNoSQLDB:0:credentials:host"] as? String
你也可以通过部分路径检索配置对象;例如,如果你使用 manager["VCAP_SERVICES:cloudantNoSQLDB:0:credentials"]
,结果将是 credentials
中键值对的字典。
要获取配置存储库中的所有配置值,请使用
manager.getConfigs()
返回值是当前配置存储库中所有配置值的原始表示。
Configuration
的灵感来自 nconf
,一个流行的 NodeJS 分层配置管理器。
有关更多信息,请访问我们的 API 参考。
此库在 Apache 2.0 许可下发布。 完整的许可证文本可在 LICENSE 中找到。