xcode中默认构建配置的意外影响

时间:2014-12-12 18:53:26

标签: xcode xcodebuild

xcode one能够设置用于xcodebuild的默认构建配置。例如。发布或调试

https://developer.apple.com/library/ios/technotes/tn2339/_index.html#//apple_ref/doc/uid/DTS40014588-CH1-MY_APP_HAS_MULTIPLE_BUILD_CONFIGURATIONS__HOW_DO_I_SET_A_DEFAULT_BUILD_CONFIGURATION_FOR_XCODEBUILD_

然而,当我在我的项目上尝试这个时,看起来它没有被使用,因为它应该

$ echo $DEVELOPER_DIR
/Applications/Xcode6.0.1.app/Contents/Developer 
$ xcodebuild  -list
Information about project "CocoaPodsExample":
    Targets:
        CocoaPodsExample
        CocoaPodsExampleTests

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        CocoaPodsExample

给定Debug默认配置:

$ git grep defaultConfigurationName
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Debug;
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Debug;
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Debug;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Debug;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Debug;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Debug;

指定DEFAULT配置使用Debug( EXPECTED

$ xcodebuild -scheme CocoaPodsExample -workspace CocoaPodsExample.xcworkspace -configuration DEFAULT build | grep "CONFIGURATION"
=== BUILD TARGET Pods-AFNetworking OF PROJECT Pods WITH THE DEFAULT CONFIGURATION (Debug) ===
=== BUILD TARGET Pods OF PROJECT Pods WITH THE DEFAULT CONFIGURATION (Debug) ===
=== BUILD TARGET CocoaPodsExample OF PROJECT CocoaPodsExample WITH THE DEFAULT CONFIGURATION (Debug) ===
=== BUILD TARGET CocoaPodsExampleTests OF PROJECT CocoaPodsExample WITH THE DEFAULT CONFIGURATION (Debug) ===

并且未指定配置使用Debug( EXPECTED

$ DEVELOPER_DIR=/Applications/Xcode6.0.1.app/Contents/Developer xcodebuild -scheme CocoaPodsExample -workspace CocoaPodsExample.xcworkspace build | grep "CONFIGURATION"
=== BUILD TARGET Pods-AFNetworking OF PROJECT Pods WITH CONFIGURATION Debug ===
=== BUILD TARGET Pods OF PROJECT Pods WITH CONFIGURATION Debug ===
=== BUILD TARGET CocoaPodsExample OF PROJECT CocoaPodsExample WITH CONFIGURATION Debug ===
=== BUILD TARGET CocoaPodsExampleTests OF PROJECT CocoaPodsExample WITH CONFIGURATION Debug ===

将Release作为默认配置

$ git grep defaultConfigurationName
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Release;
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Release;
CocoaPodsExample.xcodeproj/project.pbxproj:                     defaultConfigurationName = Release;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Release;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Release;
Pods/Pods.xcodeproj/project.pbxproj:                    defaultConfigurationName = Release;

指定DEFAULT配置使用Release( EXPECTED

$ xcodebuild -scheme CocoaPodsExample -workspace CocoaPodsExample.xcworkspace -configuration DEFAULT build | grep "CONFIGURATION"
=== BUILD TARGET Pods-AFNetworking OF PROJECT Pods WITH THE DEFAULT CONFIGURATION (Release) ===
=== BUILD TARGET Pods OF PROJECT Pods WITH THE DEFAULT CONFIGURATION (Release) ===
=== BUILD TARGET CocoaPodsExample OF PROJECT CocoaPodsExample WITH THE DEFAULT CONFIGURATION (Release) ===
=== BUILD TARGET CocoaPodsExampleTests OF PROJECT CocoaPodsExample WITH THE DEFAULT CONFIGURATION (Release) ===

并且未指定配置使用Debug( UNEXPECTED

$ xcodebuild -scheme CocoaPodsExample -workspace CocoaPodsExample.xcworkspace build | grep "CONFIGURATION"
=== BUILD TARGET Pods-AFNetworking OF PROJECT Pods WITH CONFIGURATION Debug ===
=== BUILD TARGET Pods OF PROJECT Pods WITH CONFIGURATION Debug ===
=== BUILD TARGET CocoaPodsExample OF PROJECT CocoaPodsExample WITH CONFIGURATION Debug ===
=== BUILD TARGET CocoaPodsExampleTests OF PROJECT CocoaPodsExample WITH CONFIGURATION Debug ===

就好像:

  • defaultConfigurationName仅在使用-configuration DEFAULT
  • 时使用
  • 如果未指定配置且仅调试
  • ,则忽略defaultConfigurationName

我甚至不知道这是一个错误还是预期的行为。

1 个答案:

答案 0 :(得分:3)

这也是我自己的持续集成脚本绊倒的原因,并且当我确定要运行哪些配置时,使我在xcodebuild命令中非常具体。直到几个月后我才开始研究行为,以确定实际发生的情况。

TL; DR版本:根据您发送到xcodebuild的命令,您正在观察的行为正常运行

...现在用于'

事实证明,defaultConfigurationName值是一个添加到Xcode 4之前的项目的设置,作为一种方法来描述当配置没有&时,命令行构建应该利用哪些潜在的构建配置。已经指定了......正如其名称所暗示的那样,并且与您在问题中表达的期望完全一致。

历史上有一些细微差别 - 具体来说,为什么Xcode 4很重要? Xcode 4是开发人员工具链的第一个版本,它引入了" Schemes"作为定义应用程序构建的不同方式的一种方式。 Per Apple's definition (emphasis added):

  

Xcode方案定义了要构建的目标集合,构建时要使用的配置,以及要执行的测试集合。

对着与项目相关联的.xcscheme文件,我们看到一堆配置数据与我们在现代Xcode界面的Scheme编辑器中看到的设置一致。 / Scheme的根目录中有一个部分出现在方案编辑器左侧栏中的每个项目中,可通过选择"编辑方案"从停止按钮旁边的方案选择器:

  • BuildAction映射到" Build"
  • TestAction映射到"测试"
  • LaunchAction映射到"运行"
  • ProfileAction映射到"个人资料"
  • AnalyzeAction映射到"分析"
  • ArchiveAction映射到"存档"

除了" Build"我们在Xcode中找到了一个" Build Configuration"下拉列表。此项的值会反映在.xcscheme的相应操作设置下的buildConfiguration文件中。记下为" Run"定义的构建配置。动作(通过Xcode Scheme Editor Interface)或" LaunchAction"在.xcscheme文件中。我猜测CocoaPodsExample方案已将Debug设置为Run / LaunchAction的构建配置。

在原始问题中,您的xcodebuild命令表明您正在使用工作区来整理项目。 Per documentation for xcodebuild

  

要构建Xcode工作区,必须同时传递-workspace和-scheme选项以定义构建。该方案的参数        将控制构建哪些目标以及如何构建它们,尽管您可以将其他选项传递给xcodebuild以覆盖某些参数 -        该计划的后续行动。

...因为您使用工作区,您被迫提供-scheme参数,因此正在利用"运行"下的buildConfiguration值。 Xcode Scheme Editor中的项目,等效地位于" LaunchAction:buildConfiguration"在Scheme的.xcscheme文件中设置。无论在此方案中定义的构建配置,都优先于在-configuration命令本身中未设置xcodebuild

那么为什么defaultBuildConfiguration仍然存在?

仍有遗留项目甚至一些开发团队在Xcode项目中没有采用工作区。您是要创建一个全新的测试项目,而不是将其合并到工作区中,并从包含xcodebuild build | grep "CONFIGURATION"的文件夹中运行.xcodeproj,您会看到defaultBuildConfiguration被提取

我创建了一个名为" Demo"的单视图iOS应用程序。并没有做任何其他空白项目。默认项目创建一个名为" Demo"运行构建配置设置为DebugdefaultConfigurationName默认设置为Release (注意:其中一些命令中存在特定于用户的路径 - 如果您要去要自己运行它们,请确保相应地更新路径!)

$ xmllint --xpath //Scheme/LaunchAction/@buildConfiguration Demo.xcodeproj/xcuserdata/bmusial.xcuserdatad/xcschemes/Demo.xcscheme
        buildConfiguration="Debug"
$ grep defaultConfigurationName Demo.xcodeproj/project.pbxproj 
        defaultConfigurationName = Release;
        defaultConfigurationName = Release;
        defaultConfigurationName = Release;
$ xcodebuild build | grep "CONFIGURATION"
=== BUILD TARGET Demo OF PROJECT Demo WITH THE DEFAULT CONFIGURATION (Release) ===

BUILD TARGET的输出略有变化:现在显示为:DEFAULT CONFIGURATION (Release)而不是CONFIGURATION Release。包含DEFAULT和实际配置周围的括号是xcodebuilddefaultConfigurationName回落到值的唯一指示。顺便提一下,这些相同的指示符存在于Workspace命令等效项的输出中。

由于这是一个支持Scheme的项目,我们可以使用-scheme来提取方案配置的构建配置,或者我们可以通过设置-configuration显式覆盖要使用的配置:

$ xcodebuild -scheme Demo build | grep "CONFIGURATION"
=== BUILD TARGET Demo OF PROJECT Demo WITH CONFIGURATION Debug ===
=== BUILD TARGET DemoTests OF PROJECT Demo WITH CONFIGURATION Debug ===
$ xcodebuild -configuration Debug build | grep "CONFIGURATION"
=== BUILD TARGET Demo OF PROJECT Demo WITH CONFIGURATION Debug ===

这些命令的输出回到正常的WITH CONFIGURATION样式,而配置没有用括号括起来

希望这可以让您了解自己项目的内容,并可以相应地调整命令行脚本。一旦我对其进行了排序,我就能够在我的CI脚本中不那么具体,因此随着项目的发展,与项目配置更改并行更新构建脚本的需求也减少了。当然,根据您自己项目的性质以及构建配置可能会或可能不会更改的频率,您可能希望在xcodebuild命令中遵循非常规范的方式......即,通过{{1强制执行特定配置}}。如果您遇到任何后续问题,我会全力以赴!