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/mysqlinit-key 方法. 此方法将接收配置映射 {:host "localhost" :user "root" :pass "secret"}.

接下来, Integrant 将查找 :web/handlerinit-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-keysuspend-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 许可证分发.

Author: 青岛红创翻译

Created: 2025-06-09 Mon 09:56