Windows镜像GitHub Actions中通过Chocolatey安装ImageMagick后无法使用问题
问题根因
这个问题是GitHub Actions Windows运行器的三个常见机制导致的:
- Windows默认自带的PowerShell 5.1版本中,
Out-File命令写UTF8文件时默认会携带BOM头,而GITHUB_PATH文件要求使用无BOM的UTF8编码,带BOM的内容会导致GitHub解析路径失败,表面看起来PATH已经包含对应目录,实际解析后是无效路径。 - 部分Chocolatey包(比如你用的
imagemagick.app)不会自动生成全局可调用的shim到Chocolatey的公共bin目录(该目录默认已经在系统PATH中),也不会主动把安装目录写入系统PATH。 - 写入
GITHUB_PATH的路径只会在后续的Job步骤中加载到环境变量,当前步骤的会话无法读取,因此如果把验证命令和安装路径写入操作放在同一个步骤,就算路径配置正确也会找不到命令。
可行修复方案
方案1:换用带自动shim的Chocolatey包,无需手动修改PATH
不用手动处理路径添加,直接安装官方维护的imagemagick包,安装完成后就能直接调用magick命令:
- name: Install ImageMagick on Windows if: runner.os == 'Windows' run: choco install -y imagemagick --no-progress --installargs "ADD_APPLICATION_DIRECTORY_TO_PATH=1" - name: Test ImageMagick on Windows if: runner.os == 'Windows' run: magick -version
这个方案同样适用于GraphicsMagick,直接安装graphicsmagick包即可。
方案2:修复手动添加PATH的编码问题
如果你坚持使用imagemagick.app包,修改写入GITHUB_PATH的编码为无BOM的UTF8,同时补全32位安装目录的扫描即可:
- name: Install ImageMagick on Windows if: runner.os == 'Windows' run: | choco install -y imagemagick.app --no-progress $magickPath = Get-ChildItem -Path "${env:ProgramFiles}", "${env:ProgramFiles(x86)}" | % { $_.FullName } | Select-String -Pattern "[\/\\]ImageMagick[^\/\\]*$" | Select-Object -First 1 -ExpandProperty Line # 使用无BOM的UTF8写入,兼容GitHub PATH解析规则 $magickPath | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8NoBOM - name: Test ImageMagick on Windows if: runner.os == 'Windows' run: magick -version
方案3:直接使用完整路径调用
如果不想处理PATH相关逻辑,直接把找到的可执行文件路径存为输出变量,后续步骤直接调用即可:
- name: Install ImageMagick on Windows if: runner.os == 'Windows' id: install-im run: | choco install -y imagemagick.app --no-progress $magickExe = Get-ChildItem -Path "${env:ProgramFiles}", "${env:ProgramFiles(x86)}" -Filter "magick.exe" -Recurse | Select-Object -First 1 -ExpandProperty FullName echo "magick-path=$magickExe" >> $env:GITHUB_OUTPUT - name: Test ImageMagick on Windows if: runner.os == 'Windows' run: & "${{ steps.install-im.outputs.magick-path }}" -version
其他Windows包管理器选项
如果你不想用Chocolatey,也可以换用Windows官方的包管理器winget,GitHub Actions的Windows最新镜像已经默认预装了winget,安装命令如下:
run: winget install --id ImageMagick.ImageMagick --silent --accept-package-agreements --accept-source-agreements
内容的提问来源于stack exchange,提问作者Alexander Iurovetski
相关产品推荐
相关产品推荐

