Vexil(以 旗帜学 命名)是一个 Swift 包,用于管理功能标志
(也称为功能开关),以灵活、多提供程序的方式进行。
除了本 README(涵盖基本用法和安装)之外,您还可以在我们的网站上找到更多文档:https://vexil.unsignedapps.com/
Vexil 3 目前正在积极开发中,并且是使用 Swift 宏 和 访问者模式 进行的完全重写,以减少 Mirror 的使用和内存占用,并提高整体性能。
以下文档描述了当前稳定的 2.x 版本。如果您想了解更多关于 Vexil 3 的信息,请参阅迁移指南。
如果您曾经使用过 swift-argument-parser,那么在 Vexil 中定义标志将是一种熟悉的体验。
Vexil 支持标志树,因此我们需要一个结构来容纳它们
import Vexil
struct LoginFlags: FlagContainer {
@Flag("Enables the forgot password button on the login screen and associated flows")
var forgotPassword: Bool
}
旁注: Vexil 要求为其所有标志和标志组提供描述。这被 Vexillographer 用于为您在 UI 中启用/禁用的标志提供上下文,但也为未来的开发人员(尤其是 12 个月后的您自己)提供了关于标志含义及其预期用途的上下文。
请参阅完整文档,了解如何定义标志以阅读更多内容
要检查您的标志,您需要将它们挂到 Flag Pole 上
import Vexil
let flagPole = FlagPole(hoist: AppFlags.self)
// should we show the change password screen?
if flagPole.profile.password.changePassword {
// ...
}
默认情况下,从您的源代码对 FlagPole 上的标志的访问是不可变的。这是一个经过深思熟虑的设计决策:不应从您的应用程序中轻易修改标志,因为它可能导致错误(例如,flag = true
而不是 flag == true
)。
也就是说,如果您需要,仍然可以非常容易地使用快照来修改任何标志
import Vexil
let flagPole = FlagPole(hoist: AppFlags.self)
var snapshot = flagPole.emptySnapshot()
snapshot.profile.password.changePassword = true
// insert it at the top of the hierarchy
flagPole.insert(snapshot: snapshot, at: 0)
有关更多信息,请参阅 快照。
Vexil FlagPole
支持多个后端标志来源,并附带以下内置来源
名称 | 描述 |
---|---|
UserDefaults |
任何 UserDefaults 实例都会自动符合 FlagValueSource |
快照 |
FlagPole 的所有快照都可以用作来源。 |
请参阅关于 标志值来源 的完整文档,以了解更多关于使用来源以及如何定义您自己的来源。
Vexil 提供了一种机制来修改、保存、加载和应用标志状态和值的快照。
重要提示: 快照仅反映已修改的值和状态。也就是说,快照仅应用于其中已显式设置的值。任何未设置的值都将推迟到列表中的下一个来源或默认值。例外情况是当您获取 FlagPole 的完整快照时,它会捕获每个标志的值。
快照被实现为 FlagValueSource
,因此您可以轻松地按优先级顺序应用多个快照。
快照可以做很多事情。请参阅我们的 快照指南 以了解更多信息。
您可以手动创建快照并指定哪些标志受影响
import Vexil
// create an empty snapshot
var snapshot = flagPole.emptySnapshot()
// update some values and states
snapshot.login.forgotPassword = false
snapshot.profile.password = false
// apply that snapshot - only the two values above will change
flagPole.insert(snapshot: snapshot, at: 0)
您还可以获取 FlagPole 当前状态的快照
import Vexil
let flagPole = FlagPole(hoist: AppFlags.self)
// snapshot the current state - this will get the state of *all* flags
let snapshot = flagPole.snapshot()
// save them, mutate them, whatever you like
// ...
要在您的项目中使用 Vexil,请将其作为依赖项添加到 Swift Package 中,并将其添加到您的 Package.swift
dependencies: [
.package(url: "https://github.com/unsignedapps/Vexil.git", from: "1.0.0")
]
并将其作为目标的依赖项添加
targets: [
.target(name: "MyTarget", dependencies: [
.product(name: "Vexil", package: "Vexil")
])
]
要在 Xcode 11 或更高版本中使用 Vexil,请导航到文件菜单,然后选择Swift Packages -> Add Package Dependency...,然后输入存储库 URL 和所需版本的发布详细信息。
Vexil 的第二个库产品是 Vexillographer,这是一个用于显示和操作标志的小型 SwiftUI 工具。
阅读更多关于 Vexillographer 的信息。
我们欢迎所有贡献!请阅读贡献指南,了解如何入门的详细信息。
Vexil 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。