你也讨厌升级 Angular 版本吗?因为我讨厌。我维护着几个开源项目,升级 Angular 大概是我最不喜欢的维护任务。这也是为什么我的前端更新经常被拖延太久。
但现在我们有 AI 了,对吧?它应该能根据一些指令来处理这件事。于是我决定创建一个(或者说是 vibe-code 一个)用于 Codex 的 Angular 更新技能。
创建这个技能
升级 Angular 并不只是运行ng update。通常还有好几件事需要我处理,所以我写了一个提示词,描述这个技能应该做什么:
- 遵循官方的Angular 更新指南。
- 为升级创建一个单独的 Git 分支。
- 处理迁移和依赖更新。
- 验证一切仍能构建并正常工作。
- 遵循我手动升级 Angular 时会采用的同样良好实践。
(在 .NET 中更新 NuGet 包感觉简单多了。)
Codex 生成了这个技能的第一个版本,而且出乎意料地,它奏效了!
嗯……在本地。
第一个问题:npm ci
把我的改动推送到 GitHub 后,CI 流水线失败了,报错为:
npm ci can only install packages when your package.json and package-lock.json are in sync.
经典的“在我机器上能跑”问题。这个技能成功更新了 Angular,但没有正确验证一次干净安装是否能正常工作。于是我又加了一个验证步骤:运行npm ci,然后才认为升级完成。这样,智能体就能在问题到达 CI 之前发现锁文件的问题。
第二个问题:npm 发布
接着,在尝试把我的 Angular 库发布到 npm 时,我又遇到了另一个问题:
npm error code E404
npm error 404 Not Found - PUT https://registry.npmjs.org/gramli-angular-mydatepicker - Not found
起初,这个错误信息没什么帮助。经过一番调查,我发现我的发布环境使用的是 Node.js 22 和 npm 10。
然而,根据npm 可信发布文档,可信发布要求:
- Node.js 22.14.0 或更高版本
- npm 11.5.1 或更高版本
于是我又更新了这个技能,让它优先使用与目标 Angular 版本兼容的最新 Node.js LTS 版本,同时确保 npm 版本满足任何发布要求。
第三个问题:这个技能变得太大了
经过所有这些改进,这个技能变得相当庞大。在宽松的 token 限制下这可能没什么关系,但我也希望它能让 AI 预算更有限的人使用。所以我缩短了指令,删除了不必要的重复,并保留了重要的验证步骤。主技能从 1,252 个词减少到 701 个词,完整包大约缩短了 40%。
在真实项目上测试它
当然,生成一个技能是一回事。实际使用它又是另一回事。到目前为止,我已经在三个开源项目上使用了当前版本:
- Angular 21 → 22: angular-mydatepicker PR #12
- Angular 19 → 22: FileApi PR #13
- Angular 21 → 22: AuthApi PR #113
Angular 19 → 22 的升级特别有趣,因为它需要跨三个主版本进行迁移。在 AuthApi 项目中,由于 PrimeNG 的许可变更,升级还涉及用 Optimus UI 替换 PrimeNG。
这三个升级现在都已合并。
三个项目之后
当前版本运行得相当不错,至少在我的较小项目上是这样。不过它并不完美。有些 Angular 项目比我的复杂得多,所以这个技能可能需要为它们进行调整。但它已经帮助我升级了三个项目,而且我在此过程中学到了一些东西。
最棒的部分?我终于在一周内更新了我的 Angular 项目,而不是再次推迟它们。😁
我想和社区分享这个,因为它可能对其他人有帮助。如果你想尝试这个技能或改进它,可以在这里找到: