Xcode 11 存档给出 PhaseScriptExecution 失败

Xcode 11 archive gives PhaseScriptExecution failed

在我将我的项目从 swift 3.2 迁移到 Xcode 10 中的 swift 4 之后,我尝试在 Xcode 11 中存档并给我这个错误:

PhaseScriptExecution Run\ Script /Users/desarrollo/Library/Developer/Xcode/DerivedData/MyApp-iOS-ewcyzseaubkujucenluznpmduhoo/Build/Intermediates.noindex/ArchiveIntermediates/MyApp-iOS-DEV/IntermediateBuildFilesPath/MyApp-iOS.build/Release-iphoneos/MyApp-iOS-DEV.build/Script-E95AEDE51E54767F00B60429.sh (in target 'MyApp-iOS-DEV' from project 'MyApp-iOS')

. . .

/Users/desarrollo/Library/Developer/Xcode/DerivedData/MyApp-iOS-ewcyzseaubkujucenluznpmduhoo/Build/Intermediates.noindex/ArchiveIntermediates/MyApp-iOS-DEV/IntermediateBuildFilesPath/MyApp-iOS.build/Release-iphoneos/MyApp-iOS-DEV.build/Script-E95AEDE51E54767F00B60429.sh: line 5: $(CURRENT_PROJECT_VERSION) + 1: syntax error: operand expected (error token is "$(CURRENT_PROJECT_VERSION) + 1")

在错误堆栈中我发现 export CURRENT_PROJECT_VERSION=114

我没有任何带有“$(CURRENT_PROJECT_VERSION) + 1”的脚本,所以我不知道该怎么做

更新 2:

这会导致构建被取消!看看下面 S1LENT WARRIOR 的回答,它似乎工作得更好。

更新 1:

在最新版本 Xcode(11.1 版)中,您可以相当轻松地进行内部版本号自动递增。

步骤如下:

  1. 前往目标 Build Settings
  2. 搜索 Versioning System
  3. 将其值设置为 Apple Generic
  4. 前往目标 Build Phases
  5. 添加新的运行脚本
  6. 添加以下行agvtool next-version -all

对所有目标执行此操作,每次 运行 任何目标时,它们的内部版本号都会同步和更新。

从这里得到这个答案:

P.S.: 如下评论所述

Using avgtool in a Run Script Phase causes the build to get cancelled

原版:

我想你没有做错什么。

如果您转到 info.plist,您会看到内部版本号已被 $(CURRENT_PROJECT_VERSION) 替换(您可以在“内部版本设置”选项卡中找到该变量)。

我猜你正在使用一个自动增加内部版本号的脚本,这就是导致问题的原因(我现在的项目中有同样的事情)。

如果您删除该脚本,您的应用应该不会出现此错误。

我还没有找到关于如何使脚本与这个新的 $(CURRENT_PROJECT_VERSION) 变量一起工作的解决方案。 (找到解决方案后我会更新此答案)

只需将 CFBundleVersion 从 $(CURRENT_PROJECT_VERSION) 更改为数字,在我的例子中是 1000 in Info.plist

<key>CFBundleVersion</key>
<string>1004</string>

然后 shell 将是 OKey:

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

以上所有答案本身并不能解决问题,我不得不计算其中的一部分,包括 Apple 文档(请参阅下面的参考资料)。所以这里是我执行的步骤,如果它可以帮助某人完成所有步骤。

在Info.plist中设置:

  • CFBundleShortVersionString 到 $(MARKETING_VERSION)
  • CFBundleVersion 到 $(CURRENT_PROJECT_VERSION)

在目标构建设置中:

  • 将版本控制系统设置为 "Apple Generic"
  • 将当前项目版本设置为 1(或您想要的任何版本)
  • 将营销版本设置为 1.0.0(或您想要的任何版本)

方案>存档中:

  • 添加一个 post-action "Run Script Action":
    • 从以下位置提供构建设置:您的应用
    • 在脚本中: cd ${PROJECT_DIR} ; xcrun agvtool next-version -all ;

  1. cuimingda 提到的 Apple 文档: https://developer.apple.com/library/archive/qa/qa1827/_index.html
  2. moucheg
  3. 提到的一些步骤

这是我在 Xcode 11+
上使用的脚本 只需将新的 Run Script Phase 添加到您的 Build Phases
将其添加到 Link Binary with Libraries 阶段下方。

#!/bin/sh

# To make executable, use: chmod u+x Build-Versioning-Scripts/Increment_Build_Number.sh
# to locate your target's info.plist use
# ${PRODUCT_SETTINGS_PATH}

echo "----"
echo "Info.plist for target: ${PRODUCT_SETTINGS_PATH}"

buildNum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "${PRODUCT_SETTINGS_PATH}")
echo "Current build #: $buildNum"

if [ -z "$buildNum" ]; then
echo "No build number found in $PRODUCT_SETTINGS_PATH"
exit 2
fi

buildNum=$(expr $buildNum + 1)
echo "Build # incremented to: $buildNum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNum" "$PRODUCT_SETTINGS_PATH"
echo "----"
exit 0 

此脚本最初发布于 by Alex Zavatone

希望对您有所帮助