xcode one能够设置用于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 ===
就好像:
我甚至不知道这是一个错误还是预期的行为。
答案 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"运行构建配置设置为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) ===
BUILD TARGET
的输出略有变化:现在显示为:DEFAULT CONFIGURATION (Release)
而不是CONFIGURATION Release
。包含DEFAULT
和实际配置周围的括号是xcodebuild
从defaultConfigurationName
回落到值的唯一指示。顺便提一下,这些相同的指示符存在于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强制执行特定配置}}。如果您遇到任何后续问题,我会全力以赴!