Integrant Docs
Table of Contents
Integrant 是一个用于构建具有数据驱动架构, 不可变状态和改进的重载工作流的应用程序的微框架.
它是 Stuart Sierra 的 component 库的一种替代方案, 但并非直接替换品.
1. Why Integrant?
- 配置即数据
- 组件是值
- 依赖是显式的
- API 是最小化的
- 初始化是可并行的
- 键可以是任何东西
2. Installation
2.1. Leiningen
将以下内容添加到你的 project.clj 文件的 :dependencies 中:
[integrant "0.8.1"]
2.2. deps.edn
将以下内容添加到你的 deps.edn 文件的 :deps 映射中:
integrant/integrant {:mvn/version "0.8.1"}
3. Usage
Integrant 的核心思想是, 系统是一个组件的映射 (map), 其中键 (key) 标识组件, 值 (value) 是组件的配置.
为了构建一个组件, Integrant 会查找一个名为 init-key 的多重方法 (multimethod), 该方法基于键进行派发.
例如, 我们可能有如下配置:
{:db/mysql {:host "localhost" :user "root" :pass "secret"} :web/handler {:port 8080 :db (ig/ref :db/mysql)}}
当此配置被初始化时, Integrant 将首先查找 :db/mysql 的 init-key 方法. 此方法将接收配置映射 {:host "localhost" :user "root" :pass "secret"}.
接下来, Integrant 将查找 :web/handler 的 init-key 方法. 此方法将接收 {:port 8080 :db <initialized-mysql-db>}. 请注意, 对 :db/mysql 的引用已被初始化的 MySQL 数据库组件替换.
Integrant 还有 prep-key 多重方法(multimethod), 可用于在配置初始化之前对其进行准备. 这对于加载 Aero 或 environ 配置, 或运行 clojure.spec 等操作非常有用.
为了停止系统并关闭组件, Integrant 使用 halt-key! 多重方法(multimethod). 这些方法与 init-key 一样基于键进行派发, 但它们还会接收组件的已初始化值.
Integrant 还支持 resume-key 和 suspend-key! 多重方法, 这些方法在 Repl 中重载代码时使用. 更多详情请参见 Integrant Reloaded 演讲.
可以使用 integrant.core/read-string 从 EDN 文件读取配置.
4. Composite Keys
键不必是关键字. 它们也可以是关键字的向量, 称为复合键:
{:duct.database/sql {:url "jdbc:postgresql://localhost/mydb"} [:duct.router/cascal :example.handler/routes] {:db (ig/ref :duct.database/sql)}}
在解析复合键的方法时, Integrant 将首先尝试查找完整键的方法. 如果失败, 它将查找仅与键的第一个元素关联的方法.
这使得像 Duct 这样的库可以为所有 :duct.database/sql 键定义行为, 但也允许用户为更具体的键(如 [:duct.database/sql :my-specific-database])覆盖该行为.
这是通过使 init-key(以及其他多重方法)具有层级性来实现的. 换句话说, 它的行为就像使用了 derive 一样:
(derive [:duct.database/sql :my-specific-database] :duct.database/sql)
5. Refs
Integrant 组件可以使用 integrant.core/ref 引用其他组件:
{:foo/バー {:x 1} :bar/baz {:y (ig/ref :foo/バー)}}
关键字 :foo/バー 是日语 (读作 foo/baa).
如果一个组件需要引用多个其他组件, 请使用 integrant.core/refset:
{:a {} :b {} :c {} :d {:refs (ig/refset :a :b)}}
当此配置被初始化时, :d 组件将使用以下配置映射进行初始化:
{:refs #{<initialized-a> <initialized-b>}}
其中 <initialized-a> 和 <initialized-b> 分别是从 :a 和 :b 配置创建的组件.
6. References
Integrant 被以下项目使用:
Duct - Clojure 的数据驱动框架 Reitit - Clojure/Script 的数据驱动路由库 Yurt - 数据驱动的模板引擎 Ataraxy - 数据驱动的 Ring 路由库 Kit - 用于完整 Web 应用程序的 Leiningen 模板 donut.system - 一个注重可测试性和可重载性的组件系统
7. Development
Integrant 是一个稳定的库, 很少需要更新. 建议大多数用户将其视为一个已完成的库, 并专注于在其之上构建应用程序和库.
除了维护和错误修复之外, Integrant 本身的开发并未积极进行. 新功能不太可能被接受, 除非它们解决了库用户无法轻易解决的问题.
在提交拉取请求 (pull request) 时, 请确保您已:
为您的更改编写了测试 保持代码覆盖率为 100% 维持向后兼容性
8. Talks
9. License
版权所有 © 2024 James Reeves
根据 MIT 许可证分发.