GitHub Actions Windows Runner指定Shell失效,Make调用报错求助
问题
在GitHub Actions的windows-latest Runner上执行Android构建时,已在Workflow中指定shell: powershell,但嵌套Make调用($(MAKE))仍会触发bash环境,导致报错/usr/bin/bash: line 1: rem: command not found。仓库已内置支持Windows路径的Make 4.3可执行文件,单独执行基础命令(如dir)正常,但切换Shell(cmd/pwsh)无法解决问题,推测是系统PATH中其他Make工具干扰了嵌套调用。
Workflow配置
name: build on: push: branches: [ "main" ] pull_request: branches: [ "main" ] env: BUILD_CONFIGURATION: Release jobs: android: runs-on: windows-latest steps: - name: checkout uses: actions/checkout@v3 with: submodules: recursive - name: setup cache id: external-cache uses: actions/cache@v3 with: path: | external/lib external/bin key: android-external-${{ hashFiles('external/source/**/*') }} restore-keys: android-external-${{ hashFiles('external/source/**/*') }} - name: ndk-r25b if: steps.external-cache.outputs.cache-hit != 'true' uses: nttld/setup-ndk@v1 id: setup-ndk with: ndk-version: r25c add-to-path: false - name: ndk-r13b if: steps.external-cache.outputs.cache-hit != 'true' uses: nttld/setup-ndk@v1 id: setup-ndk-r13b with: ndk-version: r13b add-to-path: false - name: build if: steps.external-cache.outputs.cache-hit != 'true' shell: powershell # cmd # pwsh env: ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} ANDROID_NDK_ROOT_R13B: ${{ steps.setup-ndk-r13b.outputs.ndk-path }} run: cd external ; ..\make\make -s -j16 TARGET_OS=android TARGET_CONFIG=${{env.BUILD_CONFIGURATION}}
执行报错信息
Run cd external ; ..\make\make -s -j16 TARGET_OS=android TARGET_CONFIG=Release cd external ; ..\make\make -s -j16 TARGET_OS=android TARGET_CONFIG=Release shell: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.EXE -command ". '{0}'" env: SOLUTION_FILE_PATH: . BUILD_CONFIGURATION: Release ANDROID_NDK_ROOT: C:\hostedtoolcache\windows\ndk\r25c\x64 ANDROID_NDK_ROOT_R13B: C:\hostedtoolcache\windows\ndk\r13b\x64 /usr/bin/bash: line 1: rem: command not found Error: Process completed with exit code 1.
解决方案
问题根源是Windows Runner默认PATH中包含Git Bash的usr/bin目录(如C:\Program Files\Git\usr\bin),其中的make是基于bash的版本,嵌套调用$(MAKE)时会优先找到这个版本,而非你仓库内置的Windows版Make。以下两种方法可解决:
方法1:将内置Make目录加入PATH最前端
在build步骤的env中修改PATH,让仓库内置的Make目录优先级最高:
- name: build if: steps.external-cache.outputs.cache-hit != 'true' shell: powershell env: ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} ANDROID_NDK_ROOT_R13B: ${{ steps.setup-ndk-r13b.outputs.ndk-path }} PATH: "${{ github.workspace }}\\make;${env.PATH}" # 优先使用仓库内的make run: cd external ; make -s -j16 TARGET_OS=android TARGET_CONFIG=${{env.BUILD_CONFIGURATION}}
这样$(MAKE)会优先调用你仓库中的Windows版Make,避免触发bash环境。
方法2:临时移除Git Bash的PATH条目
如果不需要Git Bash工具,可在执行Make前用PowerShell过滤掉包含Gitusr/bin的PATH条目:
- name: build if: steps.external-cache.outputs.cache-hit != 'true' shell: powershell env: ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} ANDROID_NDK_ROOT_R13B: ${{ steps.setup-ndk-r13b.outputs.ndk-path }} run: | # 移除Git Bash的路径,避免干扰make调用 $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -notmatch 'Git\\usr\\bin' }) -join ';' cd external ..\make\make -s -j16 TARGET_OS=android TARGET_CONFIG=${{env.BUILD_CONFIGURATION}}
说明
外层Shell指定为PowerShell仅控制初始命令的执行环境,但Makefile中的$(MAKE)会根据当前进程的PATH查找可执行文件。Windows Runner默认包含Git Bash工具链,其中的make依赖bash环境,执行Windows风格的Makefile时会解析rem注释为bash命令,导致报错。通过调整PATH确保优先使用Windows版Make即可解决。
内容的提问来源于stack exchange,提问作者user5706966

