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

Xcode执行ImageMagick convert命令报错,终端正常求解决方案

解决Xcode构建脚本执行convert命令报错的问题

以下是针对你遇到的Command PhaseScriptExecution failed with a nonzero exit code错误的具体排查和修复步骤:

1. 修复文件路径问题

脚本中直接使用betaRibbon.png会导致Xcode构建时找不到文件——Xcode的脚本执行目录是构建临时目录,不是项目根目录。必须指定该图片的完整路径:

# 假设betaRibbon.png放在项目根目录下
BETA_RIBBON_PATH="${SRCROOT}/betaRibbon.png"

同时,find命令可能返回多个匹配文件,需限制只取第一个结果,避免后续命令出错:

BASE_IMAGE_PATH=$(find ${SRCROOT} -name ${BASE_IMAGE_NAME} -type f | head -n 1)

2. 兼容Homebrew路径(Intel/M系列Mac通用)

不同架构Mac的Homebrew路径不同,脚本中硬编码/opt/homebrew/bin会导致Intel设备上找不到命令。统一PATH设置:

PATH="${PATH}:/usr/local/bin:/opt/homebrew/bin"

或者直接用brew --prefix动态获取路径:

BREW_PREFIX=$(brew --prefix)
PATH="${PATH}:${BREW_PREFIX}/bin"

3. 添加错误检查与调试日志

在脚本中加入必要的检查,提前拦截错误;开启调试模式方便定位问题:

# 开启调试模式,输出所有执行的命令
set -x

# 检查基础图标是否存在
if [ -z "$BASE_IMAGE_PATH" ]; then
  echo "错误:找不到图标文件 ${BASE_IMAGE_NAME}"
  exit 1
fi

# 检查betaRibbon图片是否存在
if [ ! -f "$BETA_RIBBON_PATH" ]; then
  echo "错误:找不到betaRibbon文件 ${BETA_RIBBON_PATH}"
  exit 1
fi

4. 使用临时目录存放中间文件

构建目录可能存在权限限制,将缩放后的ribbon文件放到系统临时目录:

RESIZED_RIBBON="/tmp/resizedRibbon_${WIDTH}.png"
convert "${BETA_RIBBON_PATH}" -resize ${WIDTH}x${WIDTH} "${RESIZED_RIBBON}"

执行完成后记得清理临时文件:

rm -f "${RESIZED_RIBBON}"

5. 验证字体可用性

Times-Bold字体在Xcode构建环境中可能无法正常调用,替换为系统默认存在的字体,比如Arial-BoldMT:

convert "${BASE_IMAGE_PATH}" -fill white -font Arial-BoldMT -pointsize 18 -gravity south -annotate 0 "Hello World" - | composite "${RESIZED_RIBBON}" - "${TARGET_PATH}"

完整修复后的脚本

PATH="${PATH}:/usr/local/bin:/opt/homebrew/bin"
set -x

function generateIcon () {
  BASE_IMAGE_NAME=$1
  BETA_RIBBON_PATH="${SRCROOT}/betaRibbon.png"
  
  TARGET_PATH="${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/${BASE_IMAGE_NAME}"
  BASE_IMAGE_PATH=$(find ${SRCROOT} -name ${BASE_IMAGE_NAME} -type f | head -n 1)
  
  if [ -z "$BASE_IMAGE_PATH" ]; then
    echo "错误:找不到图标文件 ${BASE_IMAGE_NAME}"
    exit 1
  fi
  
  if [ ! -f "$BETA_RIBBON_PATH" ]; then
    echo "错误:找不到betaRibbon文件 ${BETA_RIBBON_PATH}"
    exit 1
  fi
  
  WIDTH=$(identify -format %w "${BASE_IMAGE_PATH}")
  RESIZED_RIBBON="/tmp/resizedRibbon_${WIDTH}.png"
  
  convert "${BETA_RIBBON_PATH}" -resize ${WIDTH}x${WIDTH} "${RESIZED_RIBBON}"
  convert "${BASE_IMAGE_PATH}" -fill white -font Arial-BoldMT -pointsize 18 -gravity south -annotate 0 "Hello World" - | composite "${RESIZED_RIBBON}" - "${TARGET_PATH}"
  
  rm -f "${RESIZED_RIBBON}"
}

generateIcon "60.png"
generateIcon "120.png"

额外排查步骤

  • 查看Xcode构建日志的详细错误:点击报错信息右侧的展开箭头,确认具体是convert命令不存在、文件找不到还是字体问题。
  • 验证Xcode的PATH:在脚本开头添加echo $PATH,构建后查看日志中的PATH是否包含Homebrew的bin目录。
  • 给脚本添加执行权限:在终端中运行chmod +x 你的脚本文件.sh(如果是外部脚本文件而非Xcode内嵌脚本)。

内容的提问来源于stack exchange,提问作者dbenitobaldeon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:55:13