创建Xcode自定义模版
最近有个需求要搞一个大基座,要求项目都按照某种方式生成,然后功能模版就和组件一样,一个个勾选就可以了。
思考
对于模版的功能,我第一个念头就想到是元编程
- 按照需求生成一个元模版
- 通过自定义参数生成出基于元模版的一些功能模块
- 编写脚本,提供一套手脚架
Xcode模版
平时我们创建iOS工程的时候,选择的一些模版,包括App、framework、App Extension其实都是一个模版,模版分2类:
- Project Templates 工程模版
- File Templates 文件模版
路径在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
(不同的Xcode版本可能有所不同)
自定义模版
如果我们要创建一个自定义模版,不能在系统的模版上重新创建,需要在~/Library/Developer/Xcode/Templates
去创建
# ~/Library/Developer/Xcode/Templates/{模版类别}/{模版名称}.xctemplate
mkdir -p ~/Library/Developer/Xcode/Templates/ding_qili
cp -R /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project\ Templates/iOS/Application/App.xctemplate ~/Library/Developer/Xcode/Templates/ding_qili/ding_qili.xctemplate
然后重启Xcode,新建一个工程,在选择中多了一个类别和一个模版,因为模版是完全拷贝过来的,创建的自定义项目和默认创建项目是一样的
App.xctemplate 模版分析
- TemplateIcon.png: 模版显示的图片
- TemplateInfo.plist
- Kind :类别好像没发现什么特殊的作用
- Identifier: 唯一标记,不要和系统的冲突,会出现覆盖现象
- Ancestors:继承与哪个模版,可以多选
- Concrete:是否展示出来,如果选择NO,那就变成匿名的模版,只能被别人继承使用
- Description:描述
- SortOrder:显示的排序,越小越显示在前面
- NameOfInitialFileForEditor: 未知好像和SwiftUI相关
- Options: 可选项
- …其他
实战–创建一个带Podfile的模版
因为模版没有相关的开发文档,只能通过网上的一些信息加上自己的摸索,接下来我通过修复官方的模版,创建一个自带Podfile的模版。
我们先看下效果
- Options添加一个新的选项
- 类型是Popup,支持2种包的集成方式,Pod和Swift Package,默认是Pod(Swift Package未实现)
- 在Units添加选择类型的实现,这边是Copy 模版下的Podfile文件 到 当前工程下,并且不选中任何的Target
总结
这边就不在发散开来讲了,模版的需求本来就不多而且没有官方的文档,如果要自定义一个,我建议参考官方的文档摸索着写写,可以立马上手。