0deps 运动:本地依赖与不可变契约
软件开发人员经常安装数百个外部库。现代框架依赖于数千个传递依赖(transitive dependencies)。这意味着你的应用程序正在运行来自陌生人的代码。
这会产生软件供应链风险。
每个依赖项都会增加你的攻击面。它可能会:
- 引入安全漏洞。
- 成为供应链攻击的目标。
- 被维护者弃用。
- 更改其公共 API。
- 破坏向后兼容性。
0deps 运动提出了一个简单的问题:如果你的应用程序只依赖于你控制的代码会怎样?
在 0deps 模型中,你将必要的依赖项直接嵌入到你的项目仓库中。你不再在构建过程中动态下载它们。从一开始,运行应用程序所需的一切都保留在仓库中。
这种方法提供了:
- 可复现的构建。
- 更少地依赖外部注册表。
- 集中式的安全审计。
- 更高的可预测性。
核心原则并不是让代码保持静态。实现和算法必须不断演进,以修复漏洞并提高安全性。保持稳定的是公共契约(public contract)。
每个库都暴露一个精心设计的接口。示例包括:
authenticate()createSession()verifyPasskey()
这些函数定义了一个契约。该契约永远不会改变。你可以重写其背后的代码,或者完全更换库。应用程序的其他部分不会察觉到这种变化。
当漏洞出现时,你通常面临两个问题:
- 修复漏洞。
- 检查更新是否会破坏你的应用程序。
在 0deps 架构中,第二个问题消失了。你更新内部实现,而公共 API 保持不变。你的应用程序无需更改代码即可继续工作。
你使用内部适配器来隔离外部集成: Application -> Public Interface -> Adapter -> Implementation
如果一个库明天消失了,你只需要更改适配器。应用程序的其他部分不会受到影响。
0deps 并不会让软件变得完美。它降低了供应链风险。它能防止恶意软件包、注册表受损和依赖混淆(dependency confusion)等问题。
项目会持续数十年。库和框架在不断变化。有了 0deps,无论生态系统如何演变,你的应用程序都可以继续使用相同的稳定契约。
