更新npm/ng-packagr后发布npm包时包名与版本错误解决方案
问题原因
NPM 8.x 版本调整了npm publish命令的参数解析逻辑:当传入的参数是不带路径前缀的目录名时,NPM会优先将其识别为远程仓库的包名,而非本地目录路径。
你脚本里写的npm publish dist,会让NPM直接匹配公共仓库里名为dist的第三方公共包,拉取该包0.1.2版本的元信息和文件列表(就是日志里显示的包含bin/dist.js、test测试用例的无关内容),完全跳过对你本地dist目录下ng-packagr构建产物的读取,所以最终识别到的包名、版本和文件列表全部不符合预期。
另外根目录package.json中"private": true的配置是合理的,该配置只会阻止根目录私有项目被误发布,不会影响子目录构建产物的发布流程,无需修改。
可行修复方案
二选一即可,推荐优先用第一种,改动最小:
- 方案1:给目录参数加本地路径前缀,强制NPM识别为本地路径
将根目录package.json里的publish脚本修改为:
增加"publish": "npm publish ./dist"./前缀后,NPM会明确将参数解析为当前工作目录下的dist文件夹,自动读取该文件夹内package.json配置的@me/ng13包名、1.0.0版本等元信息,不会再去匹配远程同名包。 - 方案2:切换到构建产物目录后再执行发布,彻底避免路径解析歧义
将publish脚本修改为:
该写法直接在dist目录内执行发布命令,NPM默认读取当前目录的package.json,不存在参数解析混淆的可能。"publish": "cd dist && npm publish"
验证方式
修改脚本后,可先执行带预检查参数的命令验证:
npm run publish -- --dry-run
待输出的包名、版本、文件列表和ng-packagr构建产物完全一致后,再去掉--dry-run执行正式发布即可。
内容的提问来源于stack exchange,提问作者Mickey P
相关产品推荐
相关产品推荐

