xcode中默认生成配置的意外影响
xcode one能够设置用于xcode构建的默认构建配置。例如,发布或调试 然而,当我在我的项目上尝试这一点时,它看起来并不像它所说的那样被使用xcode中默认生成配置的意外影响,xcode,xcodebuild,Xcode,Xcodebuild,xcode one能够设置用于xcode构建的默认构建配置。例如,发布或调试 然而,当我在我的项目上尝试这一点时,它看起来并不像它所说的那样被使用 $ echo $DEVELOPER_DIR /Applications/Xcode6.0.1.app/Contents/Developer $ xcodebuild -list Information about project "CocoaPodsExample": Targets: CocoaPodsExample
$ 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
给定调试默认配置:
$ 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;
指定默认配置将使用调试(预期值)
而不指定配置将使用调试(预期值)
给定版本作为默认配置
$ 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;
指定默认配置使用版本(预期版本)
不指定配置将使用调试(意外的)
就好像:
- defaultConfigurationName仅在使用-configuration DEFAULT时使用
- 如果未指定任何配置且仅调试,则忽略defaultConfigurationName
我甚至不知道这是一个bug还是预期的行为。这也是我自己的持续集成脚本的绊脚石,导致我在决定运行哪种配置时在
xcodebuild
命令中非常具体。直到几个月后,我才深入研究这种行为,以确定到底发生了什么
TL;DR版本:您观察到的行为正常运行给定您向xcodebuild
发出的命令
…现在来看“为什么”
事实证明,defaultConfigurationName
值是添加到Xcode 4之前的项目中的一个设置,用于描述在未指定配置时,命令行生成应该利用可能存在的许多构建配置中的哪一个……完全如其名称所示,并且与您所表达的期望完全一致在你的问题中
在这段历史中有一些细微差别——具体来说,为什么Xcode 4很重要?Xcode 4是开发人员工具链的第一个版本,它引入了“方案”的概念,作为定义构建应用程序的不同方式的一种方式
Xcode方案定义了要构建的目标集合、构建时要使用的配置以及要执行的测试集合
查看与项目关联的.xcscheme
文件,我们会看到一组配置数据,这些数据与我们在现代Xcode界面的Scheme编辑器中看到的设置一致。对于显示在方案编辑器左侧栏中的六个项目,在/Scheme的根目录中有一个部分,可通过从“停止”按钮旁边的方案选择器中选择“编辑方案”来访问:
映射到“Build”BuildAction
映射到“Test”TestAction
映射到“运行”LaunchAction
映射到“Profile”ProfileAction
映射到“分析”AnalyzeAction
映射到“存档”ArchiveAction
.xcscheme
文件中buildConfiguration
的相应操作设置下。注意为.xcscheme
文件中的“运行”操作(通过Xcode方案编辑器界面)或“启动”操作定义的构建配置。我猜,CocoaPodsExample
方案将Debug
设置为运行/启动操作的构建配置
在原始问题中,您的xcodebuild
命令表示您正在使用工作区来组织项目:
要构建Xcode工作区,必须传递-workspace和-scheme选项来定义构建。方案的参数
将控制生成哪些目标以及如何生成目标,尽管您可以将其他选项传递给xcodebuild以覆盖某些参数-
这项计划的执行者
…由于您使用的是工作区,因此您必须提供一个-scheme
参数,从而利用Xcode方案编辑器中“Run”项下的buildConfiguration
值,该值位于方案的.xcscheme
文件中的“LaunchAction:buildConfiguration”设置中。此方案中定义的任何生成配置优先于在xcodebuild
命令本身中不设置-configuration
那么为什么defaultBuildConfiguration
仍然存在?
仍然有一些遗留项目,甚至一些开发团队没有在他们的Xcode项目中采用工作区。如果您创建一个全新的测试项目,而不是将其合并到工作区中,并从包含.xcodeproj
的文件夹中运行xcodebuild | grep“CONFIGURATION”
,您将看到defaultBuildConfiguration
被选中
我创建了一个名为“demo”的IOS应用程序,对空白项目没有做任何其他的事情。默认项目创建一个名为“Demo”的方案,该方案的运行构建配置设置为Debug
,而defaultConfigurationName
默认设置为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) ===
构建目标
的输出略有变化:它现在的内容是:默认配置(发布)
而不是配置发布
。包含DEFAULT
和实际配置周围的括号是xcodebuild
已回落到defaultConfigurationName
的值的唯一指示。顺便说一句,这些同样的我
$ 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;
$ 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) ===
$ 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 ===
$ 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) ===
$ 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 ===