You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions Windows Runner指定Shell失效,Make调用报错求助

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:05:02