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 失败的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11 - 产品/存档卡在通知扩展上

Xcode 11 成功的存档不会显示在管理器中,

“产品包含无效产品” Nativescript Xcode 存档

无法在 Xcode 6.1 中存档正在工作的 6.0.1 Swift 项目/分段错误:11

使用 Xcode 的命令行构建工具存档(xcodebuild 存档)

Xcode 版本 9.1 (9B55) 上传存档失败 - iOS 11.1 - 应用程序必须使用公共 (GM) 版本构建