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 版)中,您可以相当轻松地进行内部版本号自动递增。
步骤如下:
- 前往目标
Build Settings
- 搜索
Versioning System
- 将其值设置为
Apple Generic
- 前往目标
Build Phases
- 添加新的运行脚本
- 添加以下行
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 ;
- cuimingda 提到的 Apple 文档:
https://developer.apple.com/library/archive/qa/qa1827/_index.html
- moucheg
提到的一些步骤
这是我在 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。
希望对您有所帮助
在我将我的项目从 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 版)中,您可以相当轻松地进行内部版本号自动递增。
步骤如下:
- 前往目标
Build Settings
- 搜索
Versioning System
- 将其值设置为
Apple Generic
- 前往目标
Build Phases
- 添加新的运行脚本
- 添加以下行
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 ;
- cuimingda 提到的 Apple 文档: https://developer.apple.com/library/archive/qa/qa1827/_index.html
- moucheg 提到的一些步骤
这是我在 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
此脚本最初发布于
希望对您有所帮助