文章目录
背景
试试最新的编程助手kiro(amazon开发的),帮我们用go实现一款nodejs的依赖管理工具。功能上以yarn为样例,所以我称之为garn。
✨ 特性亮点
- 🚀 高性能: 7.05秒安装97个包,接近Yarn性能
- 💾 智能缓存: 100%缓存命中率,显著提升重复安装速度
- ⚡ 并发优化: Worker Pool架构,多线程并发下载
- 🔗 部分兼容: 支持常用Yarn命令和package.json配置
- 🌐 网络优化: HTTP/2支持,连接池复用,批量查询
- 📊 实时进度: 友好的进度显示和状态反馈
- 🛡️ 稳定可靠: 完整的错误处理和恢复机制
功能
| 功能 | 状态 | 测试命令样例 | 说明 |
|---|---|---|---|
| 基础命令 | |||
| 帮助信息 | ✅ 完成 | garn --help |
显示所有可用命令和选项 |
| 版本信息 | ✅ 完成 | garn --version |
显示 Garn 版本信息 |
| 配置仓库源 | ✅ 完成 | garn config set registry |
更换npm源 |
| 包管理 | |||
| 安装所有依赖 | ✅ 完成 | garn install |
根据 package.json 安装所有依赖,支持并行下载、进度显示、依赖解析 |
| 添加包 | ✅ 完成 | garn add lodash |
添加新的依赖包,支持指定版本和 Scoped 包 |
| 移除包 | ✅ 完成 | garn remove lodash |
从项目中移除依赖包 |
| 快速移除node_modules | ✅ 完成 | garn clean-modules |
从项目快速删除node_modules依赖,类似rimraf |
| 脚本执行 | |||
| 运行脚本 | ✅ 完成 | garn run build 或 garn build |
执行 package.json 中的脚本,支持直接执行和错误处理 |
| 文件管理 | |||
| 锁文件管理 | ✅ 完成 | garn install |
生成和维护 garn.lock 确保可重现安装 |
| 版本管理 | |||
| Semver 支持 | ✅ 完成 | garn add lodash@^4.0.0 |
支持语义化版本规范,版本范围匹配,Latest 版本 |
| 网络和缓存 | |||
| NPM 注册表兼容 | ✅ 完成 | garn install |
完全兼容 NPM 注册表,包完整性验证,Tarball 解压,网络错误处理 |
| 测试和质量 | |||
| 测试覆盖 | ✅ 完成 | go test ./... |
单元测试,基准测试,集成测试 |
| 工作区支持 | 🔄 计划中 | garn workspace |
Monorepo 工作区支持 |
| 兼容性 | |||
| 跨平台支持 | ✅ 完成 | 所有命令 | 完全支持 Windows/Linux/macOS 平台,Node.js 兼容 |
性能测试
garn的依赖安装速度为yarn的1.1倍, 使用vite+vue3+element-plus项目进行测试

运行日志
> ..\bin\garn install
Installing dependencies...
📖 Reading package.json...
📦 Installing 4 packages...
🔄 Resolving dependency tree...
✅ Resolved 100 packages (including dependencies)
⬇️ Downloading 100 packages...
📦 [ 1%] encodeurl@2.0.0 (cached) (1/100)
📦 [ 4%] forwarded@0.2.0 (cached) (4/100)
📦 [ 2%] is-glob@4.0.3 (cached) (2/100)
📦 [ 3%] safe-buffer@5.2.1 (cached) (3/100)
📦 [ 5%] balanced-match@1.0.2 (cached) (5/100)
📦 [ 6%] destroy@1.2.0 (cached) (6/100)
📦 [ 7%] get-intrinsic@1.3.1 (cached) (7/100)
📦 [ 8%] mime-db@1.52.0 (cached) (8/100)
📦 [ 9%] etag@1.8.1 (cached) (9/100)
📦 [ 10%] ms@2.0.0 (cached) (10/100)
📦 [ 11%] ipaddr.js@1.9.1 (cached) (11/100)
📦 [ 12%] unpipe@1.0.0 (cached) (12/100)
📦 [ 13%] readdirp@3.6.0 (cached) (13/100)
📦 [ 14%] on-finished@2.4.1 (cached) (14/100)
📦 [ 15%] ee-first@1.1.1 (cached) (15/100)
📦 [ 16%] media-typer@0.3.0 (cached) (16/100)
📦 [ 17%] send@0.19.2 (cached) (17/100)
📦 [ 18%] dunder-proto@1.0.1 (cached) (18/100)
📦 [ 19%] setprototypeof@1.2.0 (cached) (19/100)
📦 [ 20%] utils-merge@1.0.1 (cached) (20/100)
📦 [ 21%] async-function@1.0.0 (cached) (21/100)
📦 [ 22%] hasown@2.0.2 (cached) (22/100)
📦 [ 23%] iconv-lite@0.4.24 (cached) (23/100)
📦 [ 24%] parseurl@1.3.3 (cached) (24/100)
📦 [ 25%] simple-update-notifier@1.1.0 (cached) (25/100)
📦 [ 26%] has-symbols@1.1.0 (cached) (26/100)
📦 [ 27%] merge-descriptors@1.0.3 (cached) (27/100)
📦 [ 28%] side-channel-list@1.0.0 (cached) (28/100)
📦 [ 29%] async-generator-function@1.0.0 (cached) (29/100)
📦 [ 30%] depd@2.0.0 (cached) (30/100)
📦 [ 31%] fill-range@7.1.1 (cached) (31/100)
📦 [ 32%] normalize-path@3.0.0 (cached) (32/100)
📦 [ 33%] mime@1.6.0 (cached) (33/100)
📦 [ 34%] range-parser@1.2.1 (cached) (34/100)
📦 [ 35%] call-bind-apply-helpers@1.0.2 (cached) (35/100)
📦 [ 36%] proxy-addr@2.0.7 (cached) (36/100)
📦 [ 37%] raw-body@2.5.3 (cached) (37/100)
📦 [ 38%] braces@3.0.3 (cached) (38/100)
📦 [ 39%] to-regex-range@5.0.1 (cached) (39/100)
📦 [ 40%] anymatch@3.1.3 (cached) (40/100)
📦 [ 41%] side-channel@1.1.0 (cached) (41/100)
📦 [ 42%] function-bind@1.1.2 (cached) (42/100)
📦 [ 43%] object-inspect@1.13.4 (cached) (43/100)
📦 [ 44%] body-parser@1.20.4 (cached) (44/100)
📦 [ 45%] cookie-signature@1.0.7 (cached) (45/100)
📦 [ 46%] safer-buffer@2.1.2 (cached) (46/100)
📦 [ 48%] finalhandler@1.3.2 (cached) (48/100)
📦 [ 47%] get-proto@1.0.1 (cached) (47/100)
📦 [ 49%] serve-static@1.16.3 (cached) (49/100)
📦 [ 50%] content-disposition@0.5.4 (cached) (50/100)
📦 [ 51%] debug@2.6.9 (cached) (51/100)
📦 [ 52%] statuses@2.0.2 (cached) (52/100)
📦 [ 53%] has-flag@3.0.0 (cached) (53/100)
📦 [ 54%] is-extglob@2.1.1 (cached) (54/100)
📦 [ 55%] brace-expansion@1.1.12 (cached) (55/100)
📦 [ 56%] http-errors@2.0.1 (cached) (56/100)
📦 [ 57%] content-type@1.0.5 (cached) (57/100)
📦 [ 58%] is-binary-path@2.1.0 (cached) (58/100)
📦 [ 59%] touch@3.1.1 (cached) (59/100)
📦 [ 60%] toidentifier@1.0.1 (cached) (60/100)
📦 [ 61%] type-is@1.6.18 (cached) (61/100)
📦 [ 62%] chokidar@3.6.0 (cached) (62/100)
📦 [ 63%] binary-extensions@2.3.0 (cached) (63/100)
📦 [ 64%] es-errors@1.3.0 (cached) (64/100)
📦 [ 65%] mime-types@2.1.35 (cached) (65/100)
📦 [ 66%] bytes@3.1.2 (cached) (66/100)
📦 [ 67%] side-channel-map@1.0.1 (cached) (67/100)
📦 [ 68%] pstree.remy@1.1.8 (cached) (68/100)
📦 [ 69%] ignore-by-default@1.0.1 (cached) (69/100)
📦 [ 70%] gopd@1.2.0 (cached) (70/100)
📦 [ 71%] call-bound@1.0.4 (cached) (71/100)
📦 [ 72%] es-object-atoms@1.1.1 (cached) (72/100)
📦 [ 73%] supports-color@5.5.0 (cached) (73/100)
📦 [ 74%] picomatch@2.3.1 (cached) (74/100)
📦 [ 75%] generator-function@2.0.1 (cached) (75/100)
📦 [ 76%] concat-map@0.0.1 (cached) (76/100)
📦 [ 77%] methods@1.1.2 (cached) (77/100)
📦 [ 78%] cookie@0.7.2 (cached) (78/100)
📦 [ 79%] vary@1.1.2 (cached) (79/100)
📦 [ 80%] qs@6.14.0 (cached) (80/100)
📦 [ 81%] escape-html@1.0.3 (cached) (81/100)
📦 [ 82%] accepts@1.3.8 (cached) (82/100)
📦 [ 83%] math-intrinsics@1.1.0 (cached) (83/100)
📦 [ 84%] express@4.22.1 (cached) (84/100)
📦 [ 85%] fresh@0.5.2 (cached) (85/100)
📦 [ 86%] is-number@7.0.0 (cached) (86/100)
📦 [ 87%] path-to-regexp@0.1.12 (cached) (87/100)
📦 [ 88%] minimatch@3.1.2 (cached) (88/100)
📦 [ 89%] inherits@2.0.4 (cached) (89/100)
📦 [ 90%] array-flatten@1.1.1 (cached) (90/100)
📦 [ 91%] undefsafe@2.0.5 (cached) (91/100)
📦 [ 92%] glob-parent@5.1.2 (cached) (92/100)
📦 [ 93%] negotiator@0.6.3 (cached) (93/100)
📦 [ 94%] side-channel-weakmap@1.0.2 (cached) (94/100)
📦 [ 95%] es-define-property@1.0.1 (cached) (95/100)
📦 [ 96%] undici-types@7.16.0 (cached) (96/100)
📦 [ 97%] nodemon@2.0.22 (cached) (97/100)
📦 [ 98%] semver@7.0.0 (cached) (98/100)
📦 [ 99%] @types/node@25.0.3 (cached) (99/100)
📦 [100%] lodash@4.17.21 (cached) (100/100)
🎉 Successfully downloaded 100 packages!
🔒 Lockfile updated
🎉 Installation completed successfully!
使用体验
链接: https://pan.baidu.com/s/17r-PMhoXXZ_oR9fkWH_aeg?pwd=vh8a
免责声明
本软件仅支持学习、交流使用,请勿用于任何商业场景。
总结
kiro似乎不如windsurf, 5000行代码后,agent开始破坏已有功能且难以修复。