Vexil

Vexil(以 旗帜学 命名)是一个 Swift 包,用于管理功能标志
(也称为功能开关),以灵活、多提供程序的方式进行。




功能特性

文档

除了本 README(涵盖基本用法和安装)之外,您还可以在我们的网站上找到更多文档:https://vexil.unsignedapps.com/

Vexil 3 迁移

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

要在您的项目中使用 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+ 中

要在 Xcode 11 或更高版本中使用 Vexil,请导航到文件菜单,然后选择Swift Packages -> Add Package Dependency...,然后输入存储库 URL 和所需版本的发布详细信息。

Vexillographer:一个 SwiftUI 标志操作工具

Vexil 的第二个库产品是 Vexillographer,这是一个用于显示和操作标志的小型 SwiftUI 工具。

Vexillographer screenshots

阅读更多关于 Vexillographer 的信息。

贡献

我们欢迎所有贡献!请阅读贡献指南,了解如何入门的详细信息。

许可证

Vexil 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。