Xcode 11 存档给出 PhaseScriptExecution 失败
Posted
技术标签:
【中文标题】Xcode 11 存档给出 PhaseScriptExecution 失败【英文标题】:Xcode 11 archive gives PhaseScriptExecution failed 【发布时间】:2019-09-30 14:27:32 【问题描述】:在 Xcode 10 中将我的项目从 swift 3.2 迁移到 swift 4 后,我尝试在 Xcode 11 中存档并给我这个错误:
PhaseScriptExecution 运行\脚本 /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 (在项目“MyApp-iOS”的目标“MyApp-iOS-DEV”中)
。 . .
/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: 第 5 行:$(CURRENT_PROJECT_VERSION) + 1:语法错误:预期操作数 (错误标记为“$(CURRENT_PROJECT_VERSION) + 1”)
在错误堆栈中我发现 export CURRENT_PROJECT_VERSION=114
我没有任何带有“$(CURRENT_PROJECT_VERSION) + 1”的脚本,所以我不知道该怎么做
【问题讨论】:
您的某个脚本中一定有错误。 【参考方案1】:更新 2:
这会导致构建被取消!看看下面 S1LENT WARRIOR 的回答,似乎效果更好。
更新 1:
在最新版本的 Xcode(11.1 版)中,您可以相当轻松地进行内部版本号自动递增。
步骤如下:
-
转到目标的
Build Settings
搜索Versioning System
将其值设置为Apple Generic
转到目标的Build Phases
添加新的运行脚本
添加以下行agvtool next-version -all
对所有目标执行此操作,每次运行任何目标时,它们的内部版本号都会同步和更新。
从这里得到这个答案:https://***.com/a/58237340/1432355
P.S.:正如下面评论中所说的那样
在运行脚本阶段使用 avgtool 会导致构建被取消
原文:
我认为你没有做错任何事。
如果您转到info.plist
,您会看到内部版本号已被$(CURRENT_PROJECT_VERSION)
替换(您可以在“构建设置”选项卡中找到该变量)。
我猜你正在使用一个自动增加内部版本号的脚本,这导致了问题(我现在的项目中有同样的事情)。
如果您删除该脚本,您的应用应该不会出现此错误。
我还没有找到关于如何使脚本与这个新的$(CURRENT_PROJECT_VERSION)
变量一起工作的解决方案。 (找到解决方案后我会更新这个答案)
【讨论】:
在运行脚本阶段使用avgtool
会导致构建被取消。你有什么解决办法吗?
@Rafał 是的,我也注意到了……下周我会回到这个问题,一旦找到真正有效的解决方案,我会更新这个答案(再次……)
我在计划中的帖子操作中使用了它。不取消构建
我使用的是 Xcode 12.3,它仍然会分阶段为我取消构建,仍然可以作为后期操作
@theReverend 谢谢,我会在周末调查【参考方案2】:
以上所有答案本身并不能解决问题,我必须计算其中的一堆,包括 Apple 文档(请参阅下面的参考资料)。因此,如果它可以帮助某人完成所有步骤,那么这是我执行的步骤。
在 Info.plist 中,设置:
CFBundleShortVersionString 到 $(MARKETING_VERSION) CFBundleVersion 到 $(CURRENT_PROJECT_VERSION)在目标构建设置中:
将版本控制系统设置为“Apple Generic” 将当前项目版本设置为 1(或您想要的任何版本) 将 Marketing Version 设置为 1.0.0(或您想要的任何版本)在方案中>存档:
添加动作后“运行脚本动作”: 从您的应用程序提供构建设置 在脚本中:cd $PROJECT_DIR ; xcrun agvtool next-version -all ;
-
cuimingda 提到的 Apple 文档:
https://developer.apple.com/library/archive/qa/qa1827/_index.html
moucheg提到的一些步骤
【讨论】:
我遵循了完全相同的步骤。但存档不断取消。我正在使用 Xcode 11。有什么解决方案可以避免取消存档吗? 太棒了!完美运行 - 除了我必须将 Bundle Version 更改为随机数,例如 1。当我做$(CURRENT_PROJECT_VERSION)
时,它没有用。【参考方案3】:
只需将 CFBundleVersion 从 $(CURRENT_PROJECT_VERSION)
更改为数字,在我的情况下是 Info.plist 中的 1000
<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"
【讨论】:
如果你想修改current_project_version,你可以在苹果文档developer.apple.com/library/archive/qa/qa1827/_index.html找到答案【参考方案4】:这是在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
此脚本最初由 here 由 Alex Zavatone 发布。
希望对你有帮助
【讨论】:
这非常有效!所有与 avg 工具相关的解决方案都使存档被取消。这在 Xcode 11 中对我有用。以上是关于Xcode 11 存档给出 PhaseScriptExecution 失败的主要内容,如果未能解决你的问题,请参考以下文章
“产品包含无效产品” Nativescript Xcode 存档
无法在 Xcode 6.1 中存档正在工作的 6.0.1 Swift 项目/分段错误:11
使用 Xcode 的命令行构建工具存档(xcodebuild 存档)
Xcode 版本 9.1 (9B55) 上传存档失败 - iOS 11.1 - 应用程序必须使用公共 (GM) 版本构建