Yarn 1.22发布包时publishConfig覆写main字段未生效咨询
Yarn v1.22 属于经典版Yarn,这个版本里的publishConfig 只支持覆写registry、access、dist-tag这类和npm发布配置相关的参数,根本不支持覆写main、module这类包入口字段。你预期的「publishConfig自动替换package.json字段」的逻辑,是Yarn v3+、pnpm v7+、npm v7之后才新增的扩展特性,在Yarn v1环境下执行yarn publish或者npm publish时,publishConfig里的main配置会被直接忽略,自然不会生效。
你当前的配置如果直接发布,安装后会直接报找不到入口的错误:因为main指向的src目录根本没被包含在files配置的发布文件列表里。
方案1:发布前动态修改package.json(Yarn v1生态最通用方案)
这是Yarn v1 workspace monorepo场景下使用最多的方案,无额外依赖、稳定无坑,不影响本地开发体验:
- 先在组件库包下写一个简单的Node脚本,用于构建完成后修改package.json的入口字段:
// scripts/fix-publish-pkg.js const fs = require('fs'); const path = require('path'); const pkgPath = path.resolve(__dirname, '../package.json'); const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); // 替换为发布时需要的入口配置 pkg.main = 'dist/index.js'; // 有module、types等其他入口字段也可以在这里同步修改 fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
- 调整package.json的脚本配置,串起完整的发布流程:
{ "scripts": { "build": "tsc", // 替换为你实际的组件库构建命令 "prepublishOnly": "yarn build && node scripts/fix-publish-pkg.js", "postpublish": "git checkout package.json" } }
- 注意:必须用
prepublishOnly钩子,不要用旧的prepublish——后者在执行yarn install/npm install时也会触发,会打乱本地开发的配置。postpublish里的还原逻辑是为了避免把发布专用的配置提交到代码仓库,保证本地开发时main依然指向src/index.ts,不影响源码调试。
配置完成后可以先执行yarn pack模拟打包,检查生成的压缩包内的package.json字段、文件列表是否符合预期,确认没问题再正式发布。
方案2:通过路径映射做开发态源码联动,去掉动态修改逻辑
如果不想写额外的脚本,可以直接把package.json的main字段固定为构建产物路径,开发阶段通过TS/构建工具的路径别名实现源码联动:
- 修改组件库package.json,删掉publishConfig里无效的main配置:
{ "name": "components", "private": false, "version": "0.1.2", "main": "dist/index.js", "files": ["dist"], "publishConfig": { "registry": "你的发布源地址", "access": "public" // 这里只保留registry、access、tag这类原生支持的配置项即可 } }
- 在monorepo根目录的
tsconfig.json里配置paths映射,让本地开发时直接引用源码:
{ "compilerOptions": { "paths": { "components": ["packages/components/src/index.ts"] } } }
如果用Vite、Webpack等构建工具,也同步加一下对应的别名配置即可,开发体验和之前没有区别。
方案3:升级包管理工具
如果团队允许调整工程化配置,可以升级到Yarn v3+(Berry版本)或者pnpm v7+,这两个工具原生支持发布时自动读取publishConfig下的main、module、exports等字段,替换package.json内的对应值,不需要写额外的处理脚本。但Yarn v1到Berry的迁移有一定成本,需要提前评估适配工作量。
- 不要把未编译的
src目录加入files发布列表,会无谓增加包体积,还可能导致用户端直接加载TS源码报错 - 所有发布配置调整完,都要先用
yarn pack/npm pack --dry-run做模拟发布校验,避免正式发版出错
内容的提问来源于stack exchange,提问作者Andrew Zheng

