NPM Workspaces能否按依赖顺序构建Monorepo项目并完成Verdaccio发布?
NPM Workspaces能否按依赖顺序构建Monorepo项目并完成Verdaccio发布?
刚好之前折腾过类似的monorepo构建+本地私服发布的需求,来给你理清楚:
首先直接给结论:NPM Workspaces本身没有内置的「按依赖顺序执行脚本/构建」的能力,但完全可以搭配轻量工具或者自定义配置,实现你要的「先构建依赖包→再构建业务包→依次发布到Verdaccio」的流程,而且比Bazel轻量太多。
最省心的方案:用Lerna配合NPM Workspaces
Lerna现在是npm官方维护的工具,和Workspaces兼容性拉满,而且学习成本很低,完美解决依赖顺序的问题:
- 先安装Lerna:在根目录执行
npm install lerna -D - 配置根目录的package.json:
把Workspaces和脚本配置好,比如:
这里的{ "name": "your-monorepo-root", "private": true, "workspaces": ["packages/*"], "scripts": { "build": "lerna run build --sort --stream", "publish:verdaccio": "lerna publish --registry http://localhost:4873 --yes" }, "devDependencies": { "lerna": "^7.0.0" } }--sort参数是核心,它会自动解析各个包之间的依赖关系,先执行被依赖的包的build脚本,再执行依赖它的包,完全匹配你的需求。 - 给每个子包配置build脚本:
比如你的common包(被其他项目依赖)的package.json里:
依赖它的业务包的package.json里正常声明依赖即可:{ "name": "@your-scope/common", "version": "1.0.0", "scripts": { "build": "tsc" // 你的TypeScript构建命令 }, "main": "dist/index.js", "types": "dist/index.d.ts" }"@your-scope/common": "^1.0.0" - 构建+发布流程:
- 先执行
npm run build:Lerna会按依赖顺序依次构建所有包,--stream参数能让你在终端看到实时的构建日志 - 构建完成后,执行
npm run publish:verdaccio:Lerna同样会按依赖顺序把包发布到你的本地Verdaccio,而且会帮你处理版本号(如果需要统一升级版本,也可以用lerna version命令)
- 先执行
不用额外工具的话?自己写脚本(不推荐)
如果你不想加额外依赖,也可以自己写Node脚本:遍历所有包的package.json,解析它们的依赖关系,做拓扑排序,然后按顺序执行npm run build和npm publish命令。但这种方式需要维护依赖解析的逻辑,后续包结构变了还要改脚本,太折腾,不如直接用现成工具省心。
关于Verdaccio的小提醒
- 发布前要确保Verdaccio已经启动,并且你已经在本地私服上注册了用户:执行
npm adduser --registry http://localhost:4873跟着提示走就行 - 可以在根目录或者子包的
.npmrc里配置registry=http://localhost:4873,这样就不用每次命令都加--registry参数了
总之,用NPM Workspaces + Lerna的组合,完全能替代Bazel实现你的需求,而且轻量好上手,不会有Bazel那种陡峭的学习曲线。
备注:内容来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

