基于Lerna+npm Workspaces的Monorepo:构建后如何执行npm ci?
解决Monorepo构建后本地包找不到的问题
核心原因
你把server的package.json单独拿到build目录执行npm ci时,npm会默认去公共npm registry拉取@myProj/shared,但这个包只存在于你的本地monorepo中,并未发布到公共仓库,所以触发404错误。
具体解决方案
方案一:打包本地包为tgz,在server依赖中引用
这是生产环境最稳妥的方案,不依赖本地链接:
- 进入
shared包目录,执行npm pack,生成类似@myProj/shared-1.0.0.tgz的压缩包(版本号以shared包的package.json为准)。 - 把这个tgz包复制到server的
build目录下。 - 修改
server/build/package.json的依赖项,将"@myProj/shared": "*"替换为"@myProj/shared": "./@myProj/shared-1.0.0.tgz"。 - 再执行
npm ci,npm会直接从本地tgz包安装依赖,不会请求公共registry。
方案二:编译时将shared代码合并到server产物中
通过TypeScript路径映射,把shared代码直接编译进server的build目录,彻底摆脱对本地包的依赖:
- 在server的
tsconfig.json中添加路径配置:{ "compilerOptions": { "baseUrl": ".", "paths": { "@myProj/shared": ["../shared/src"] } }, "include": ["src/**/*", "../shared/src/**/*"] } - 执行
tsc构建server时,会自动把shared的代码一起编译到server的build目录里。 - 此时server的build产物已包含shared的所有代码,执行
npm ci时可直接移除@myProj/shared依赖(或保留但不会触发远程请求)。
方案三:复制本地包产物到server的node_modules
适合快速测试或内部部署场景:
- 在monorepo根目录执行
npm install,npm workspaces会自动把@myProj/shared软链接到server的node_modules中。 - 分别构建shared和server包,确保shared的产物输出到
shared/build目录。 - 把
shared/build下的所有文件(包括package.json)复制到server/build/node_modules/@myProj/shared目录中。 - 最后在server的build目录执行
npm ci即可。
内容的提问来源于stack exchange,提问作者Yoav Moran
相关产品推荐
相关产品推荐

