如何使用覆盖的非通配符 PROVISIONING_PROFILE 从命令行构建带有框架的工作区

How to build a workspace with frameworks from command line with overridden non-wildcard PROVISIONING_PROFILE

我的工作区由具有框架目标的项目和使用这些框架的应用程序项目组成。

要使用覆盖的配置文件构建工作区,我正在使用下一个命令:

/usr/bin/xcodebuild -sdk iphoneos clean build -workspace <workspace-name> 
-scheme <scheme-name> -configuration Release 
PROVISIONING_PROFILE=<profile-uuid>

配置文件是非通配符。

从 Xcode 分发构建正常执行。 从命令行生成错误是因为 xcodebuild 还覆盖了框架的配置文件并尝试对其进行签名。

Code Sign error: Provisioning profile does not match bundle identifier: 
The provisioning profile specified in your build settings (“<profile-name>”) 
has an AppID of “<profile-app-id>” which does not match your 
bundle identifier “<framework-bundle-id>”.

这很奇怪,因为从 Xcode 构建时,在构建最终应用程序后,框架会使用应用程序的配置文件重新签名,并且不需要在构建过程中对它们进行签名。

如何避免这个问题?

UPD:命令行构建由覆盖 PROVISIONING_PROFILE 变量的持续集成系统上的插件执行。这就是为什么继续使用该变量而不是一些用户定义的变量至关重要的原因。但似乎这是不可能的。 Xcode 首先使用您指定的任何匹配配置文件执行框架的冗余签名,然后 - 在将框架安装到捆绑包时使用应用程序的配置文件,并且无法避免这种冗余的首次签名。

来自 Apple 的回答,我遇到了报告的错误:

This issue behaves as intended based on the following:

Settings passed on the command-line to xcodebuild will override all instances of that setting across all targets being built. That's how it works.

In order to override only selected targets, you would need to do something tricky in your target set-up, for example:

In the target, assuming the target is named "MyTarget":

PROVISIONING_PROFILE=$(PROVISIONING_PROFILE_$(TARGET_NAME)) PROVISIONING_PROFILE_MyTarget=

And then in xcodebuild, you would do:

xcodebuild PROVISIONING_PROFILE_MyTarget=

If you have multiple targets you need to selectively override then you could do this for each of them, replacing 'MyTarget' in the setting name with the appropriate name for each target.

所以目前他们更愿意在工作区构建期间保持框架的冗余签名。