Vibe Coding 依赖退出演练:替换、删除并证明残留归零
删除一行 import 和运行卸载命令不代表已经离开依赖。本文盘点运行、构建、类型、生成物、配置与数据耦合,用行为合同替换实现,再从干净环境证明包、残留和隐式下载归零。
本文要点
- 主题聚焦:AI、Vibe Coding、DevOps、开源
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
pnpm remove old-lib 成功、TypeScript 编译通过,团队就宣布依赖已删除;几周后干净 CI 才发现代码生成仍调用旧 CLI,生产数据仍是旧序列化格式,或另一个 workspace 通过传递路径把同一包装了回来。卸载命令只修改 manifest/lockfile 的一部分状态,不会自动消除行为、制品和数据耦合。
AI 编程工具退出演练迁移的是整套 Agent 工具的规则、任务和权限。本篇范围更窄:一个代码依赖能否由当前仓库替换或删除,并证明旧包不再参与安装、构建和运行。
先画依赖占用面
从精确包和版本出发,用包管理器 explain/why 查直接、传递与 workspace 引入路径;npm explain 能显示包为何被安装,但静态树仍不是全部。搜索 import/require、动态加载字符串、CLI 命令、package scripts、构建插件、配置键、类型引用、测试环境、mock、代码生成器、样式副作用、native binary、镜像复制和文档操作步骤。
再找派生耦合:由旧生成器提交的源码、数据库/缓存序列化格式、文件扩展名、环境变量、遥测字段、公共 API 类型和用户导出。删除调用方不代表历史数据能被新实现读取。仓库依赖图驱动的改动规划可把这些构建、符号、配置和运行时边纳入影响闭包,未知动态边应阻断“已完全删除”的结论。
为每条边标注 owner、替换策略和验证:删除无需功能、改用运行时能力、内部小实现、替代包、adapter 双实现,或先迁移数据。基线冻结当前产品行为、错误语义、边界输入、性能/体积预算和支持平台;不能把旧库的所有偶然行为都当合同,也不能为了方便替换悄悄改变用户结果。
先在接口边界替换行为
若旧库已散落业务代码,先建立表达产品能力的窄接口,把调用方迁到接口,旧实现仍保持行为。用 characterization 和契约测试覆盖真正依赖的输入/输出,Vibe Coding 遗留行为特征测试可区分已观察行为与应保留需求。测试预言来自产品规则和兼容决定,不只让新旧实现互相比较。
实现候选后对同一冻结样本运行双实现,差异逐项分类为 bug、批准变化或未知。写路径涉及持久格式时采用 expand/migrate/contract:先让新代码读旧新格式,再迁移并对账,最后停止写旧格式;不能先卸载旧解码器。第三方协议由 adapter 隔离,退出时仍要处理重试、鉴权和远端遗留资源。
小而无状态的依赖可以直接替换,但也要测试异常、Unicode、时区、取消和并发等实际边界。替换为标准库时锁定最低支持运行时;替代包则重新走必要性、健康、脚本和许可证准入,不能把“退出 A”变成未经审查地引入 B。
从干净环境执行真正删除
使用仓库锁定的包管理器移除直接声明,让工具更新 manifest 与 lockfile;不要手工删几行 YAML 猜解析结果。若包仍存在,explain/why 必须给出剩余上游,决定它是合理传递依赖还是也需升级/替换。名称相同但版本不同要逐条对账。
删除旧 adapter、配置、环境变量、allowlist、补丁、类型 shim、mock、fixture、脚本、缓存键和仅为它存在的 CI 权限。重新生成由当前 schema 管理的产物;无法再生成且仍需保留的历史文件,明确转为自有制品并记录来源,而不是假装没有旧依赖。
在空缓存、无旧 node_modules 的环境 frozen install,运行 lint、类型、单元、契约、集成、构建和支持平台 smoke。扫描安装树、bundle、source map、server output、镜像/SBOM、许可证/notice 和运行网络,确认旧包名、摘要、二进制与下载域名不再出现。仅在源码 rg 零命中不够,压缩 bundle 也应通过结构化清单审查。
依赖升级与锁文件兼容门用于解释 lockfile 闭包变化;编程 Agent 的改动验证门约束测试选择和发布前证据。删除后故意恢复一个旧配置或历史数据样本,确认迁移器给出受控结果,而不是在罕见路径动态下载旧包。
演练失败和回退
退出演练在正式事故前进行,可选非关键模块或隔离分支,不部署。记录完成所需时间、计划外边、行为差异和需要上游协助的材料。若候选失败,在旧依赖尚未撤销前回到旧 adapter,并保持本轮新增数据仍可由旧实现读取;一旦数据完成不可逆转换,只能 fail-forward 或从已验证备份恢复。
验收清单要求:所有占用边有决定,产品合同通过,历史数据已迁移/保留策略明确,直接声明为零,非批准传递路径为零,最终制品/SBOM 残留为零,旧网络与 CI 权限为零,干净重建成功。每个“零”附命令、工具版本和当前提交,不用聊天总结代替证据。
把退出条件写回最初依赖决定,并在 major 升级、维护停滞或运行时提供替代能力时复演。可删除性不是追求零依赖,而是确保一个包不再合适时,团队知道它占据哪里、如何保持行为、怎样证明已经离开。这样的依赖才是被项目使用,而不是项目被它长期绑住。
Related