Xcode工程配置

561 阅读4分钟

workspace和project

当我们入职新公司的时候,使用git拉下来代码的时候会在文件夹中看到一个蓝色的xcode图标的文件xxx.xcodeproj和一个白色的xcode图标的文件xxx.xcworkspace,如下图:

image.png

但我们在新建一个工程的时候却只有一个xxx.xcodeproj文件。只有在使用pod配置之后才有白色的xxx.xcworkspace。

image.png 但我们通过显示包内容其实可以看到其内部其实也是有xxx.xcworkspace的。

image.png

对于白色xcworkspace来说就是工作空间,而蓝色的xcodeproj来说就是项目,一个工作空间内可以有多个项目,由pod生成的工作空间,包括原本的项目,还有Pods.xcodeproj。

在xcworkspace里面有3个文件:

image.png

  • 第一个:workspace的配置文件xml格式

image.png 如果想修改、新增、删除project可以修改此文件。

  • 第二个:共享数据
  • 第三个:用户数据

Target和Scheme

Target就是有一个具体的产出物。一个Project中可以有多个不同的Tareget。例如Pods中根据不同的第三方库都是一个不同的target:

image.png 当然我们也可以在自己Project中新建Target,也可以用现有的Target复制出来一份新的Target。

image.png 当我们完成复制之后,发现我们在Xcode中并不能运行这个Target。找不到我们刚才新建的Target:

image.png 因为我们在运行的时候,运行的不是Target,而是Scheme,Scheme在这里可以翻译为方案,也就是我们执行运行的时候需要具体的执行方案才可以。需要重新创建Scheme:

image.png image.png

image.png 从上面可以看出,Scheme中包含一个Target。Scheme中不仅有Run动作,还有Build、Analyze、Archive、Execution、Launch、Profile、Test。在每个动作的之前和之后都可以配置Pre-Actions和Post-Actions。同时可以在Scheme中去指定Target的环境,一些配置参数等等。

image.png

scheme分为共享和自己两种模式,如果是共享的话会存在xxx.xcodeproj包内: image.png

我们在给测试同学给包的时候,根据网络环境(Test,Debug,Release)可以配置多个Target和多个Scheme,每个Target的BoundID和AppName不一样,这样环境就一目了然(从App名字就能看出来),而且是不影响开发测试人员正常使用线上App同时不用环境的问题也可以更容易的排查。

Xcode是⼀个终端

Xcode把⽣成产物需要的参数(Build Settings)例如clang需要的参数, 以定义shell环境变量的形式,定义在Xcode的shell环境中。

image.png

image.png

image.png 当然如果想看到所有的环境变量,可以故意写错脚本。等编译器报错,将会提示所有可以使用的环境参数。

image.png 如果在编写脚本的时候需要将Run script中的内容输出到自己的终端的时候,需要使用tty找到终端的环境,然后在脚本中重定位:

image.png

重定位一下: image.png 再次执行就可以在终端中看到输出内容,而不用去bulid日志里面去找了。

image.png

Configurations

Xcode允许使用Config文件来管理和配置Project和Target。config文件需要配置在PROJECT -> Info -> Configurations中。

image.png 新建文件的时候是可以找到这种类型。

image.png

新建之后文档注释中有一个链接🔗,里面介绍了xcconfig文件的用法。 在xcconfig文件中我们可以直接获取或者配置build setting的环境变量。

那么我们的buidlSetting的配置,可以在Project中配置,可以在Target配置,可以通过xcconfig文件配置,xcconfig文件即可以配置给Project也可以配置给Target。当配置冲突的时候,会以哪里的配置为准呢?

image.png 这样就一目了然了。从图中的优先级顺序我们可以大致总结如下:

  • Target的优先级高于Project;
  • xcode可视化配置优先于xconfig文件中的配置。

如果在xcode可视化配置中想继承xconfig文件中的配置可以增加一项$(inherited)

image.png

在xcconfig文件中定义的环境变量也会被xcode导出在Shell环境中使用:

HELLO_WORLD = "hello world!"

image.png

image.png

也可以将自己定义的环境变量配置到info.plist文件中,在代码中访问。