xcodebuild命令行工具使用
如何通过命令行编译ios项目?
xcodebuild是一个命令行工具,允许你从命令行对Xcode项目和工作区执行编译、查询、分析、测试和归档操作。它对项目中包含的一个或多个目标或项目或工作区中包含的方案进行操作。xcodebuild提供了几个执行这些操作的选项,如其手册页所示。默认情况下,xcodebuild将命令的输出保存在Xcode应用程序的locations首选项窗格中定义的位置中。
有关各种xcodebuild用法,请参见下文。在运行以下任何命令之前,请确保导航到终端中包含项目或工作空间的目录。
-
要列出工作区中的所有方案,请在终端中运行以下命令:
xcodebuild -list -workspace <your_workspace_name>.xcworkspace
<your_workspace_name>是指你项目里工作空间的名字。
列出MyApplication工作区中的所有方案:
-
要列出项目中使用的所有目标、生成配置和方案,请在终端中运行以下命令:
xcodebuild -list -project <your_project_name>.xcodeproj
<your_project_name>是指你的项目名。
列出有关MyProject(一个Xcode项目)的所有信息:
-
要在项目中构建方案,请在终端中运行以下命令:
xcodebuild -scheme <your_scheme_name> build
其中<your_schemename>和build分别是要构建的方案的名称和要对方案执行的操作。
构建tvOS方案:
注意:xcodebuild支持可以在目标或方案上执行的各种构建操作,如构建(build)、分析(analyze)和归档(archive)。然而,当未指定任何操作时,默认情况下会执行构建。
-
要使用配置文件构建目标,请在终端中运行以下命令:
xocdebuild -tartget <your_target_name> -xcconfig <your_configuration_file>.xcconfig
其中的<your_target_name>和<your_configuration_file>分别是要构建的目标的名称和配置文件的名称。
使用配置文件来编译iOS目标:
-
要更改xcodebuild命令的输出位置,请使用SYROOT(生成产品路径)和DSTROOT(安装生成产品位置)生成设置,它们分别为Debug product和.dSYM文件以及release product指定一个位置。
为iOS程序的Debug版本设置位置:
为iOS程序的Release版本设置位置:
如何通过命令行来执行单元测试?
xcodebuild工具提供了一些选项来执行单元测试。
要通过命令行编译执行单元测试,可在终端执行以下命令:
通过命令行编译但不运行单元测试,可在终端执行以下命令:
通过命令行运行单不编译单元测试,可在终端运行以下命令的一种
测试操作需要指定方案(scheme)和目标(destination)。
-workspace选项用于指定你的工作空间的名字,该选项应在你的方案里包含工作空间时使用。
-project选项用于指定你的xcode project的名字,该选项应在你的方案里包含xcode project的时候使用。当同一目录中有多个Xcode项目时,它是必需的,否则是可选的。
-destination选项用于为你的单元测试指定一个目标,它接受一个参数
-only-testing和-skip-testing选项是可选的,它们分别表示运行或跳过指定的测试,它们接受一个参数
TestTarget[/TestClass[/TestMethod]]
TestTarget是必需的,是测试包的名称。TestClass和TestMethod都是可选的,它们分别表示类的名称和要测试的方法的名称。
-
对于Mac OS应用程序, destinationspecifier支持platform和arch两个key, 如表1所示,这两个key是在macOS上运行单元测试所必须的
表1:
以下是在macOS中执行测试方案的示例,其中destinationspecifier设置为“platform=macOS,arch=x86_64”。
xcodebuild test -scheme macOS -destination 'platform=macOS,arch=x86_64'
-
对于iOS和tvOS应用程序,destinationspecifier支持的key为platform、name和id,如表2所示
在udid为965058a1c30d845d0dcec81cd6b908650a0d701c的设备上测试iOS方案:
xcodebuild test -workspace MyApplication.xcworkspace -scheme iOSApp -destination 'platform=iOS,id=965058a1c30d845d0dcec81cd6b908650a0d701c'
在iPhone上测试iOSApp方案:
在iPhone上测试但跳过“iOSAppUITests”:
xcodebuild test -workspace MyApplication.xcworkspace -scheme iOSApp -destination 'platform=iOS,name=IPhone' -skip-testing:iOSAppUITests
只测试iOSAppTests单元测试中的第二个测试类中的testExampleB:
-
对于iOS模拟器和tvOS模拟器应用程序,destinationspecifier支持的key为platform、name、id、OS。如表3所示
name和id键可与平台交互使用,平台是必需的键,OS键是可选的。
在iPad(12.9英寸)iOS 10.2的模拟器上测试iOS方案:
xcodebuild test -scheme iOS -destination 'platform=iOS Simulater,name=iPad Pro(12.9-inch),OS=10.2'
在D6FA2C2A-E297-406A-AA22-624B4834ACB2标识的tvOS模拟器上测试tvOS方案:
xcodebuild test -scheme tvOS -destination 'platform=tvOS Simulater,id=D6FA2C2A-E297-406A-AA22-624B4834ACB2'
destination选项还允许您在多个目标上运行相同的单元测试。这是通过多次将其添加到xcodebuild测试命令中完成的,如下所示。
在模拟器和iPod touch上测试iOS方案:
xcodebuild test -scheme iOS -destination 'platform=iOS Simulater,name=Iphone 6s,OS=10.3' -destination 'platform=iOS,name=iPod touch'
注:xcodebuild按顺序运行测试。例如,在上面的例子中,xcodebuild将首先在模拟器中测试iOS,然后在iPod touch上执行它。
如何通过命令行分别实现为测试编译和测试但不编译?
-
xcodebuild为Xcode的Product>build for>testing特性提供了
操作。你必须指定一个方案来使用它。要使用它,请在终端中执行以下命令: 使用D6FA2C2A-E297-406A-AA22-624B4834ACB2标识的tvOS模拟器在tvOS方案中构建测试和相关目标:
xcodebuild build-for-testing -scheme tvOS -destination 'platform=tvOS Simulator,id=D6FA2C2A-E297-406A-AA22-624B4834ACB2'
build-for-testing生成一个xctestrun文件,保存在driverData文件夹中。
-
xcodebuild为Xcode的Product>Perform action>test without building特性提供了test-without-building命令。test-without-building要求你指定方案或xctestrun文件。
-
使用方案时的用法:
重要提示:使用方案时,test-without-building在构建根目录(SYMROOT)中搜索捆绑包。因此,在运行此命令之前,请确保构建目标或构建根目录包含要测试的捆绑包。
在模拟器中使用iOS 10.1在iPhone SE上测试iOSApp方案:
xcodebuild test-without-building -workspace MyApplication.xcworkspace -scheme iOSApp -destination 'platform=iOS Simulater,name=iPhone SE,OS=10.1'
-
使用xctestrun文件时的用法:
<your_xctestrun_name>是指包含测试运行参数的文件的名称。
重要提示:当使用xctestrun文件时,test-without-building将在文件中指定的路径上搜索捆绑包。因此,在运行此命令之前,请确保捆绑包位于指定路径。
使用6DC4A7BA-EA7F-40D6-A327-A0A9DF82F7F6标识的iOS模拟器测试iOSApp_iphonesimulator.xctestron中指定的捆绑包和其他参数:
使用3D95DF14-E8B7-4A05-B65B-78F381B74B22标识的iOS模拟器,测试除iOSApp_iphonemasimulator.xctstrun中指定的iOSAppUITest之外的所有测试:
xcodebuild test-without-building -xctestrun iOSApp_iphonesimulater.xctestrun -destination 'platform=iOS Simulator,id=3D95DF14-E8B7-4A05-B65B-78F381B74B22' -skip-testing:iOSAppUITests
注:build-for-testing和test-without-building为持续集成系统提供支持
-