You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:52:31