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
相关产品推荐
相关产品推荐

