0deps 运动:本地依赖与不可变契约
软件开发人员通常在每个项目中安装数百个外部库。现代框架依赖于数千个传递依赖(transitive dependencies)。这意味着您的应用程序正在运行来自数百名未知贡献者的代码。
这种速度为您的软件供应链带来了巨大的风险。
0deps 运动提出了一个简单的问题: 如果您的应用程序只运行您实际控制的代码会怎样?
每一个依赖项都会增加您的攻击面。它可能会引入安全漏洞、被弃用,或者通过新更新破坏您的代码。您会失去对生产环境中运行代码的控制权。
在 0deps 模型中,您将所有依赖项直接引入您的项目仓库。您不会在安装过程中动态下载它们。构建和运行应用程序所需的一切都已经就绪。
这种方法具有以下几个优势:
- 可复现的构建 (Reproducible builds)
- 减少对外部包注册表的依赖
- 集中式的安全审计
- 更好的可预测性
- 更低的供应链风险
其核心原则并不是阻止代码发生变化。算法和安全修复必须不断演进。保持稳定的是公共契约(public contract)。
每个库都暴露一个精心设计的接口。
authenticate()createSession()verifyPasskey()
这些函数定义了一个契约。该契约永远不会改变。您可以重写底层代码或完全替换该库。应用程序的其他部分保持不变,因为它只与契约进行交互。
当漏洞出现时,您可以在内部进行修复。您更新接口背后的实现。公共 API 保持不变。您的应用程序无需更改代码即可继续运行。
这种结构使用内部适配器(adapter)来隔离外部代码: 应用程序 ↓ 公共接口 ↓ 适配器 ↓ 实现
如果某个外部库消失了,您只需更新适配器。应用程序的其他部分不会受到影响。
0deps 运动并不是要反对开源。它改变了您使用开源的方式。库变成了由您自行审计和版本管理的集成组件。
这创造了可以延续数十年的软件。实现方式会改变,但您的契约保持不变。这种稳定性使您的软件具有可预测性和韧性。
