翻译: 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一如既往的大力支持.