Semantic Release无法正确发布指定dist文件夹问题求助
核心问题分析
package.json的files配置错误
你在根目录package.json里写的"/dist"是绝对路径,npm的files字段不识别绝对路径,会直接忽略。而且你把这个package.json复制到dist目录后,它的files配置变成了找dist目录下的dist子文件夹,这显然不存在,导致npm不会打包目标内容,反而回退到默认逻辑打包整个项目目录。semantic-release执行路径与配置不匹配
你cd到dist目录执行semantic-release,但如果semantic-release的配置文件(比如.release.config.js)在frontend根目录,它会向上遍历读取配置,此时配置里的pkgRoot: './dist'会相对于frontend目录计算,和你当前所在的dist目录路径冲突,导致pkgRoot配置不生效。pkgRoot配置的作用理解偏差
pkgRoot是告诉semantic-release去哪里找要发布的package根目录,而非指定要打包的子文件夹。配置pkgRoot: './dist'后,semantic-release会把dist目录本身作为npm包的根目录发布,其中的内容就是最终npm包的内容,而不是把dist文件夹打包进去。
具体修复步骤
1. 修正dist目录下的package.json配置
复制根目录package.json到dist时,同步修改其中的files和入口字段,适配dist作为package根目录的场景:
# 替换原有的复制命令,用sed修改字段 cp package.json ./dist && \ sed -i 's/"files": \["\/dist"\]/"files": ["."]/' ./dist/package.json && \ sed -i 's/"main": "src\/index.js"/"main": "index.js"/' ./dist/package.json
(把"main": "src/index.js"替换为你dist目录里的实际入口文件路径)
2. 调整semantic-release的执行路径
不要cd到dist目录执行,直接在frontend根目录运行,确保semantic-release能正确读取配置文件:
修改GitHub Action的最后一步:
- name: Run semantic release and publish package run: npm run semantic-release
3. 确保semantic-release的npm插件配置正确
在.release.config.js中明确配置pkgRoot:
module.exports = { plugins: [ // 其他插件配置... ['@semantic-release/npm', { pkgRoot: './dist' }] ] };
这个配置会让semantic-release把./dist目录作为npm包的根目录,发布其中的所有内容(由dist目录下的package.json的files字段控制)。
4. 验证dist目录结构
确保dist目录下的结构符合npm包的要求,示例结构如下:
frontend/ ├── dist/ │ ├── package.json (已修改好files和main字段) │ ├── index.js │ └── 其他编译后的产物文件 ├── src/ └── package.json
内容的提问来源于stack exchange,提问作者Giga Meta

