最近有个需求要搞一个大基座,要求项目都按照某种方式生成,然后功能模版就和组件一样,一个个勾选就可以了。

思考

对于模版的功能,我第一个念头就想到是元编程

  • 按照需求生成一个元模版
  • 通过自定义参数生成出基于元模版的一些功能模块
  • 编写脚本,提供一套手脚架

Xcode模版

平时我们创建iOS工程的时候,选择的一些模版,包括App、framework、App Extension其实都是一个模版,模版分2类:

  1. Project Templates 工程模版
  2. File Templates 文件模版

路径在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates (不同的Xcode版本可能有所不同)

截屏2020-12-24 下午2.43.07.png

自定义模版

如果我们要创建一个自定义模版,不能在系统的模版上重新创建,需要在~/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,新建一个工程,在选择中多了一个类别和一个模版,因为模版是完全拷贝过来的,创建的自定义项目和默认创建项目是一样的

截屏2020-12-24 下午2.56.50.png

App.xctemplate 模版分析

  1. TemplateIcon.png: 模版显示的图片

截屏2020-12-24 下午3.51.02.png

  1. TemplateInfo.plist
  • Kind :类别好像没发现什么特殊的作用
  • Identifier: 唯一标记,不要和系统的冲突,会出现覆盖现象
  • Ancestors:继承与哪个模版,可以多选
  • Concrete:是否展示出来,如果选择NO,那就变成匿名的模版,只能被别人继承使用
  • Description:描述
  • SortOrder:显示的排序,越小越显示在前面
  • NameOfInitialFileForEditor: 未知好像和SwiftUI相关
  • Options: 可选项
  • …其他

实战–创建一个带Podfile的模版

因为模版没有相关的开发文档,只能通过网上的一些信息加上自己的摸索,接下来我通过修复官方的模版,创建一个自带Podfile的模版。

我们先看下效果

截屏2020-12-25 下午2.50.24.png

截屏2020-12-25 下午3.33.47.png

截屏2020-12-25 下午3.34.01.png

  • Options添加一个新的选项
  • 类型是Popup,支持2种包的集成方式,Pod和Swift Package,默认是Pod(Swift Package未实现)
  • 在Units添加选择类型的实现,这边是Copy 模版下的Podfile文件 到 当前工程下,并且不选中任何的Target

demo模版

收集的开发文档

总结

这边就不在发散开来讲了,模版的需求本来就不多而且没有官方的文档,如果要自定义一个,我建议参考官方的文档摸索着写写,可以立马上手。