xcodebuild归档失败,xcode归档成功。

5
我将尝试使用shell脚本和Xcode的命令行工具自动提交iTunesConnect的过程。到目前为止,我已经成功完成了每一步,除了最后一个:归档 。
以下是脚本中的代码:
echo "Attempting to build target: ${TARGET_PRODUCT}"
cd $ENGINE_PATH
# Clean
/usr/bin/xcodebuild clean -project projName.xcodeproj -target "${TARGET_PRODUCT}" -configuration Release
# Build and Archive
/usr/bin/xcodebuild archive -project projName.xcodeproj -scheme "${TARGET_PRODUCT}" -configuration Release -archivePath "${TARGET_PRODUCT}".xcarchive

到目前为止,archive命令无法成功创建归档。此命令的唯一输出是:** ARCHIVE FAILED **
如果我只尝试构建而不是归档,会得到:** BUILD SUCCEEDED **
归档确实在预期位置生成了一个文件,并且“显示包内容”可以展开一个与Xcode中创建的归档完全相同的目录结构,但有一个例外,即 Xcode 创建的归档还包括一个名为 SCMBlueprint 的额外文件夹。
我以前在其他论坛帖子上看到过,归档问题通常是由于代码签名或配置文件问题引起的。但是,在构建和归档过程中使用的代码签名身份验证和配置文件在控制台中被输出,我不确定这在这种情况下是个问题。 我失败的归档正在使用与成功构建相同的代码签名身份验证和配置文件。另外,我使用 Xcode 创建了一个归档,并查看了该归档中的 embedded.mobileprovision 文件。 我将其与使用 xcodebuild 生成的失败的归档进行了比较,并发现它们完全相同。
我在网上寻找其他任何有关使用 xcodebuild 归档失败的原因的建议,但到目前为止,我一筹莫展!非常感谢任何帮助!

那里必须有额外的错误信息。没有它们,你就没有找到原因的希望。 - Droppy
1
在处理命令时会有通常的输出,例如编译源代码、链接、生成targetName.app.dSYM、触摸targetName.app、签名targetName.app等,然后就是 归档失败。在失败消息之前的最后一步是-validate-for-store。尽管在其中没有进一步指示导致归档失败的原因。 - charlessunshine
1
你找到解决这个问题的方法了吗?我的项目在使用Xcode 8后出现了这个问题。 - Douglas Cobb
2个回答

7
请检查您在归档过程中是否有任何错误。同时,请比较Xcode和命令行输出之间的日志,这可能有助于您了解编译失败的哪个步骤。
我曾经遇到过相同的问题。归档失败,没有特定的原因,但.xcarchive已生成。我查看了来自xcode的构建日志,注意到它以“Build finished with errors”消息结束。尽管出现此错误,但组织者仍然显示存档,并且我能够从中导出IPA。
当我审查时,我发现由于损坏的PNG文件而引起的存档错误,在归档过程中无法压缩。错误是非致命的,因此仍然生成存档。当我修复PNG文件后,一切开始顺利编译,没有任何问题。

这是一个惊人的发现。我长期忽略了无害的 PNG 压缩错误。我肯定会传递这个模糊的命令行存档修复方法。在我看来,Apple 在他们的工具质量上确实有所遗漏。希望他们很快能找到更好的开发人员! - jcpennypincher
@Bartek 您,先生,是个天才。 - Ashraf Tawfeeq

1
这刚刚发生在我身上,与PNG不同的问题(也许接下来是更一般的情况):我有一个自定义构建阶段,它将错误输出到stderr,但是在这种情况下构建阶段没有返回与0不同的退出代码(使用Xcode 9.3(9E145)中的xcodebuild)。构建阶段类似于:
find "${SRCROOT}/Directory" -print0 | <...>

当重命名了${SRCROOT}/Directoryfind会输出一个错误但不会使脚本失败:构建日志将在执行构建阶段后包含Command /bin/sh emitted errors but did not return a nonzero exit code to indicate failure

Xcode本身没有问题,但是xcodebuild在触及DSYM后最终会失败,并显示**ARCHIVE FAILED**

修复方法是确保如果构建阶段输出到stderr,则构建阶段正确地显式返回与0不同的退出代码(如1)。在我的情况下,更改find中引用的路径解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接