设置Xcode项目生成工具” XcodeGen”


简介

我最初对它感兴趣,因此前几天在学习会议上听说了XcodeGen的LT,因此决定触摸它。

触摸后,我想将其引入业务。
"项目文件不冲突"的功能是多人开发中的一大优势。

什么是" XcodeGen"?

由Swift制作的命令行工具,可从定义文件(project.yml)生成Xcode项目文件(.xcodeproj)。

通过在YAML中写入项目设置,将自动生成项目文件。
这样就无需自己编辑项目文件。

xcodegen.png

XcodeGen除了"自动生成项目文件"外什么也不做,因此,如果您理解了这一点,将会更容易理解其好处和将来的解释。

词汇表

在本文中,术语定义如下。

  • 项目文件
    .xcodeproj指向文件
  • 工作区
    .xcworkspace指向文件
    使用CocoaPods时需要
  • 定义文件
    指向project.yml
    正式称为"项目规范"

XcodeGen

的好处

介绍引入XcodeGen的好处。

项目文件不再冲突

我认为毫不夸张地说这是最大的优点。
每个人在由多人开发iOS应用程序时遇到的"由添加文件引起的项目文件冲突"将不再发生。

原因是,如果在定义文件中使用source:指定文件夹,则该文件夹中的文件将自动添加到项目中。

project.yml

1
2
3
4
targets:
  Foo:
    sources:
      - Foo # 「Foo」フォルダ内のファイルが自動的に追加される

换句话说,您不需要仅通过添加,重命名或删除文件来更改定义文件。

项目树自动排序

根据实际文件路径自动生成项目树。
那时,它会按文件名自动排序。

轻松更改项目设置

您可以轻松添加由迦太基管理的目标或库。
由于定义文件是文本,因此您可以轻松更改其他设置。

XcodeGen

的缺点

学习费用

对于一般的库来说,这是一个劣势,但要赶上XcodeGen的概述和用法却要花钱。
我希望这篇文章能减少一点费用。

生成项目文件

需要花费时间

我的优点是:"更改文件时无需修改定义文件",但是有必要重新生成项目文件。
如果使用的是CocoaPods,则还必须从项目文件中生成一个工作区。

我制作了一个Makefile以节省时间。
https://qiita.com/uhooi/items/16a870eaae24b46103fb#生成项目文件

应该引入XcodeGen的情况

现在您已经知道XcodeGen的优缺点,我将介绍在什么情况下应该引入XcodeGen。
这只是我的意见,因此请以其为参考。

我在处理项目文件冲突

时遇到麻烦

如果由于大量人员的开发而导致项目文件冲突,则值得考虑进行介绍。

新开发时

如果您具有创建定义文件的经验,则可以复制和粘贴它们并重用它们,从而可以缩短新开发期间的项目创建时间。
另外,在新开发过程中,经常添加文件,以防止冲突。

环境

  • 作业系统:macOS Mojave 10.14.6
  • 斯威夫特:5.1.3
  • Xcode:11.3.1(11C504)
  • XcodeGen:2.11.0

设定

安装XcodeGen

从Mint安装。

薄荷文件

1
+ yonaskolb/[email protected]
1
$ mint bootstrap

要手动安装,请参阅官方文档。
https://github.com/yonaskolb/XcodeGen#installing

XcodeGen设置本身仅通过安装即可完成。

创建定义文件

在项目的根文件夹中创建一个新的定义文件。

在本文中," Foo"用作项目名称和项目的根文件夹。

1
2
$ cd Foo
$ touch project.yml

定义文件描述

从这里,我将在定义文件中一一解释最少的描述。

我无法解释所有可以设置的内容,因此请参阅官方文档以获取详细信息。
https://github.com/yonaskolb/XcodeGen/blob/master/Docs/ProjectSpec.md

名称

指定项目名称。

project.yml

1
name: Foo

指定的字符串成为项目文件名。
スクリーンショット 2020-01-29 12.15.50.png

选项

设置项目选项。

bundleIdPrefix

指定产品捆绑包标识符的前缀(以下称为"捆绑包ID")。

在本文中," com.theuhooi"用作前缀。

project.yml

1
2
options:
  bundleIdPrefix: com.theuhooi

如果指定

前缀,则每个目标的捆绑软件ID会自动设置为" {prefix}。{Target name}"。
这样就无需为每个目标指定PRODUCT_BUNDLE_IDENTIFIER

project.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
options:
  bundleIdPrefix: com.theuhooi

targets:
  Foo:
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.theuhooi.Foo # 不要

  FooTests:
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.theuhooi.FooTests # 不要

  FooUITests:
    settings:
      base:
        PRODUCT_BUNDLE_IDENTIFIER: com.theuhooi.FooUITests # 不要

如果在多平台上目标名称和捆绑包ID不匹配,请明确指定。

developmentLanguage

指定本地化的开发语言。

默认值为英语,并且为日语指定ja

project.yml

1
2
options:
  developmentLanguage: ja

project.pbxproj上的键是developmentRegion,因此请注意不要出错。

deploymentTarget

指定每个平台的部署目标。

对于iOS应用程序开发,只需指定" iOS"。

project.yml

1
2
3
options:
  deploymentTarget:
    iOS: 13.0

xcodeVersion

指定Xcode的版本。

project.yml

1
2
options:
  xcodeVersion: "11.3.1" # 変わらない?

即使我指定了

,它也没有反映在项目文件中,因此存在某些条件或者我不理解其含义。

正如我在

注释中告诉您的那样,如果不将其用双引号引起来,它将被视为无效值,并且将使用默认值。

findCarthageFrameworks

在安装由迦太基管理的框架时,是否自动安装从属框架是一项设置。

project.yml

1
2
options:
  findCarthageFrameworks: true

可能是创建框架或使用我的问题,但是即使有依赖,它也不会自动安装,或者甚至安装了额外的框架(作为仅用作测试目标的产品目标)指定它,因为它也已安装)。

carthageExecutablePath

指定迦太基的执行路径。

如果迦太基由Mint管理,则必须指定以下内容。

project.yml

1
2
options:
  carthageExecutablePath: mint run Carthage/Carthage carthage

默认值为carthage,因此如果您将Carthage与Homebrew一起安装,则不需要它。

设定

设置用于所有目标的构建设置。
如果要单独设置,请在目标的settings中对其进行描述。

我已经指定了版本和内部版本号,开发团队和调试信息格式。
仅当构建配置(以下称为"构建配置")为Debug(以下称为"调试构建")时才指定调试信息格式。

project.yml

1
2
3
4
5
6
7
8
settings:
  base:
    MARKETING_VERSION: 1.0.0
    CURRENT_PROJECT_VERSION: 1
    DEVELOPMENT_TEAM: XXXXXXXXXX
  config:
    debug:
      DEBUG_INFORMATION_FORMAT: "dwarf-with-dsym"

要将

MARKETING_VERSIONCURRENT_PROJECT_VERSION分别与版本和内部版本号相关联,您需要修改Info.plist
(目标