如何解决GitHub Workflow YAML中含括号Linux命令失效问题?
解决GitHub Workflow中删除非dist目录及发布dist内容的问题
先修正YAML语法错误
你的Workflow配置里steps的缩进位置错误,它应该属于publish-gpr job的子节点,和runs-on、permissions同级,否则Workflow会直接报错。
解决rm -rf !(dist)的失效问题
你遇到的核心问题原因:
- YAML中
!是特殊标记字符,直接写!(dist)会触发语法报错; - 加双引号后,bash的
extglob扩展(即!(pattern)匹配语法)会失效,命令会把!(dist)当成字面文件名,自然找不到对应内容,所以没效果。
方案一:开启extglob并正确处理YAML特殊字符
bash的!(dist)属于扩展通配符,需要先开启extglob选项,块级脚本中中间的!不会被YAML解析为特殊标记,可直接使用:
name: Node.js Package on: release: types: [created] jobs: publish-gpr: runs-on: ubuntu-latest permissions: write-all steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 16 - run: npm ci - run: npm run build - run: | # 开启bash扩展通配符支持 shopt -s extglob # 删除根目录下除dist外的所有内容 rm -rf !(dist) # 将dist内的内容移到根目录 cd dist && cp -R ./* ../ && cd .. # 删除空的dist目录 rm -rf dist - run: npm publish
方案二:用find命令替代(更兼容,无需依赖bash扩展)
如果不想依赖bash的extglob特性,可用find命令实现相同效果,完全避开YAML特殊字符问题:
name: Node.js Package on: release: types: [created] jobs: publish-gpr: runs-on: ubuntu-latest permissions: write-all steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 16 - run: npm ci - run: npm run build - run: | # 删除当前目录下(仅一级)除自身和dist外的所有内容 find . -maxdepth 1 -not -name '.' -not -name 'dist' -exec rm -rf {} + # 移动dist内容到根目录并删除dist cd dist && cp -R ./* ../ && rm -rf ../dist - run: npm publish
额外优化建议
如果你的package.json不在dist目录中,可以先复制进去,直接在dist目录执行npm publish,省去大量文件删除和移动的操作,更简洁高效:
# ...前面步骤保持不变 - run: npm run build - run: | # 复制package.json到dist目录(按需添加README、LICENSE等文件) cp package.json README.md LICENSE dist/ # 进入dist目录直接发布 cd dist && npm publish
内容的提问来源于stack exchange,提问作者Khanon
相关产品推荐
相关产品推荐

