Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xcode中默认生成配置的意外影响_Xcode_Xcodebuild - Fatal编程技术网

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

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

然而,当我在我的项目上尝试这一点时,它看起来并不像它所说的那样被使用

$ 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的根目录中有一个部分,可通过从“停止”按钮旁边的方案选择器中选择“编辑方案”来访问:

  • BuildAction
    映射到“Build”
  • TestAction
    映射到“Test”
  • LaunchAction
    映射到“运行”
  • ProfileAction
    映射到“Profile”
  • AnalyzeAction
    映射到“分析”
  • ArchiveAction
    映射到“存档”
在Xcode中除了“Build”项之外的所有项中,我们都可以找到一个“Build Configuration”下拉列表。此项的值反映在
.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 ===