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

如何用Lerna与Yarn Workspace复刻工作区并发布组织命名空间包

解决方案

方法一:利用Yarn Workspace的resolutions强制依赖映射

这是最通用的方案,不管项目是不是用TypeScript都能生效,完全不用改源码里的导入语句:

  • 第一步:修改两个包的package.json的name字段,分别改为@myorg/main-pack和@myorg/sub-pack。
  • 第二步:在根目录的package.json中添加resolutions配置,强制所有对sub-pack的引用都指向你的组织包:
{
  "resolutions": {
    "sub-pack": "npm:@myorg/sub-pack@*"
  }
}
  • 第三步:保持main-pack/package.json里的依赖声明不变,依然是"sub-pack": "*"。Yarn Workspace会优先使用本地工作区的sub-pack包做开发,而当@myorg/main-pack发布到npm后,其他用户安装时,Yarn/npm会通过resolutions把sub-pack解析为@myorg/sub-pack,彻底避免依赖官方包。
  • 第四步:配置lerna.json指定发布范围为@myorg,确保Lerna只处理你的组织下的包:
{
  "packages": ["packages/*"],
  "version": "independent", // 根据你的版本策略调整,比如"fixed"
  "npmClient": "yarn",
  "useWorkspaces": true,
  "scope": "@myorg"
}
  • 发布时直接运行lerna publish,Lerna会自动处理版本关联,保证@myorg/main-pack依赖的是同版本的@myorg/sub-pack。

方法二:TypeScript路径映射 + 包导出配置(仅适用于TS项目)

如果你的项目是TypeScript编写的,可以结合TS的路径映射和包导出配置,进一步优化本地开发的类型提示:

  • 前两步和方法一一致:修改包名、添加根目录的resolutions。
  • 第三步:在main-pack/tsconfig.json中配置paths,让TypeScript编译时把sub-pack的导入映射到@myorg/sub-pack:
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "sub-pack": ["../sub-pack/src"] // 本地开发时直接指向sub-pack的源码目录
    }
  },
  "include": ["src/**/*"]
}
  • 第四步:在@myorg/sub-pack/package.json中配置exports字段,确保TypeScript能正确识别包的类型和入口:
"exports": {
  ".": {
    "types": "./dist/index.d.ts",
    "require": "./dist/index.js",
    "import": "./dist/index.mjs"
  }
}

这样本地开发时TS能直接跳转sub-pack的源码,编译后的产物会自动把导入路径转换为@myorg/sub-pack,配合resolutions确保安装时依赖正确。

为什么之前的别名配置会冲突?

你之前用的"sub-pack": "npm:@myorg/sub-pack@*"会直接覆盖Yarn Workspace的工作区引用规则,导致本地开发时无法使用当前工作区的sub-pack包,只能拉取npm上的版本。而resolutions的优先级低于工作区引用,本地开发时优先用工作区的包,发布后才会映射到组织包,完美解决冲突问题。

内容的提问来源于stack exchange,提问作者Philippe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:06:31