Xcodegen介绍 | 一款可以帮助你更好的构建Xcode Project的工具

翻译: AK
声明:转发本文,请联系作者授权
原文地址

在“Better iOS projects”系列中 我们将了解各种工具的环境, 这些工作对于我们管理iOS项目是非常有用的.

xcodeprojects存在问题?

Xcode 是使用.xcodeproj 文件来管理资源和代码,同时也是编译,编辑工具.在大多数情况下是正常工作的,但它有以下几个缺点

  • 虽然你可以手动解决文件冲突, 但不能保存文件合并的正确性.
  • 同步磁盘上的目录和工程目录结束都是手动完成,有时候可以导到混乱, 已经有一个工具来处理这个问题 比如synx或xcodeproj gem 来处理排序问题
  • 在编译之前,有文件丢失时Xcode不会有禁告
  • 处理多个依赖关系和多个 target 时会很不方便

Xcodegen 介绍

Xcodegen是一个工具,它允许我们从名为project.yml的文件中的定义生成xcodeproj文件.由于xcodeproj文件可以随时生成,我们甚至不必将它保存,我们在git中并且可以忽略它(虽然我个人更喜欢保持它接受代码库管理,所以我可以看到我对project.yml的编辑有什么变化文件)。

Xcodegen 有以下两有个重要功能:
- 您可以通过这种方式为各种平台(iOS,tvOS,macOS,watchOS)定义各种Xcode目标(应用程序,框架等)。
- 他允许把代码,资源文件 关联到不同的目标文件中, 从而更容易管理文件所属的taget

虽然xcodegen现在是一个新工具但它已经可以做很多事情了, 如果有你有问题可以去git 来提交问题作者会在数小时内给你回复 ,非常感谢.

如何安装

你可以使用 xcodegen进行安装

brew tap yonaskolb/XcodeGen https://github.com/yonaskolb/XcodeGen.git
brew install xcodegen

或者你可以使用mint 进行安装 ps:你可以使用mint是一个包管理器

mint install yonaskolb/xcodegen
生成一个App Project

首先, 创建一个空的swift 工程 就可能得到所有的.swift 和.xcassets 文件.
我们现在,在工程的根目录创建一个 project.yml 文件内容如下

name: XcodegenApp # The name of the App
options: # Some general settings for the project
  createIntermediateGroups: true # If the folders are nested, also nest the groups in Xcode
  indentWidth: 2 # indent by 2 spaces
  tabWidth: 2 # a tab is 2 spaces
  bundleIdPrefix: "de.number42"
targets: # The List of our targets
  XcodegenApp:
    type: application
    platform: iOS
    deploymentTarget: "10.3"
    sources:
      #Sources
      - path: XcodegenApp

这里写图片描述

然后,你可以保存一份 重命名.xcodeproj文件 ( 这样你可以进行对比文件的修改) , 我就简单使用”Backup” 这个名
打开终端 进入到你的工程目录,执行”run xcodegen” 或 “mint run xcodegen:”
In the terminal, in your project root, run xcodegen or mint run xcodegen:

这里写图片描述

打开这个工程并运行, 你可以看到和原来的工程一样可正常运行

“和原来结果一样”? 但是 testing taget 没有, 我能听到你说的, 不用担心, 我们接下来处理这个问题

生成 TestTargets

在project.yml 文件中添加下面的 target :

  XcodegenApp-iOS-Tests:
    type: bundle.unit-test
    platform: iOS
    deploymentTarget: "10.3"
    sources:
      - path: XcodegenAppTests
    dependencies:
      - target: XcodegenApp

再一次关闭xcode(在xcode 工程打开的时候 进行修改文件可能有异常情况出现.)

生成工程文件, 打开并运行:正常!

下面添加 UI Tests target:

  XcodegenApp-iOS-UITests:
    type: bundle.ui-testing
    platform: iOS
    sources:
      - path: XcodegenAppUITests
    dependencies:
      - target: XcodegenApp
生成一个 Framework 工程

现在让我们更深入一些:
在Xcode中维护子模块总是有点麻烦。使用xcodegen轻松将模块化引入您的应用程序

为了学习如何做到这一点,我们创建了一个XcodegenAppCore框架,其中包含经典的水果枚举:
1,在根目录创建一个文件夹XcodegenAppqCore
2,创建一个Fruit.swift 文件在目录中,加入下面的代码

public enum Fruit: String {
  case apple
  case banana
  case cherry
}

这里写图片描述

3,在XcodegenAppCore目录中添加一个 Info.plist 文件
4,添加target 在project.yml文件中

XcodegenAppCore:
  type: framework
  platform: iOS
  deploymentTarget: "10.3"
  sources:
    - path: XcodegenAppCore

5,添加

dependencies:
    - target: XcodegenAppCore

在运行xcodegenDemo taget 编译正常但什么都没有输出

6,Add

import XcodegenAppCore

在 ViewController 文件viewDideLoad()方法中添加

print(Fruit.apple)

在debug 日志中可以看到输出 framework的所有者

Adding 依赖关系

在iOS 有一个很好的方法来处理依赖关系 它就是carthage
Xcodegen使管理carthage依赖项变得非常容易,所以让我们将roberthein的TinyConstraints添加为布局库来学习如何完成:

1,Run 安装 carthage

brew install carthage

2,创建一个名为 Cartfile的文件

3,Add

github "roberthein/TinyConstraints"

这里写图片描述
4,运行

carthage update --platform iOS

5,在project.yml 文件中 XcodegenApp target 添加下面代码

  - carthage: TinyConstraints

关闭xcode 运行xcodegen , 运行工程, 你现在就可以使用TinyConstraints库了

import TinyConstraints

In the viewDidLoad(), add:

let fruitLabel = UILabel()
fruitLabel.text = Fruit.banana.rawValue

view.addSubview(fruitLabel)
fruitLabel.centerInSuperview()

这里写图片描述
运行工程 查看TinyConstraints 的行为.
这里写图片描述

接下来我们做什么?

在不久的将来我们就会看到xcodegen 更多的功能 比如 生成特别的调试功能的taget.
敬请期待

致谢

感谢Yonas Kolb在发布前审阅本文,并感谢Maximiliane Windl测试教程,修复问题和制作屏幕截图。还要感谢Melanie Kloss一如既往的大力支持.

关于 ‘Better iOS Projects’的其它参考:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值