基于官方pod模板制作适合于自己的pod模板

2,395 阅读4分钟

需求背景:公司业务模块,需要下沉为独立的远程pod,以达到解除相互依赖和加快测试编译速度的效果,做到脱离主工程单独调试开发大部分功能,而壳工程难免需要用到一些通用的功能如用户信息token等在网络请求内部的封装,其他业务组件也需要用到,所以可以自己创建一个通用模板,基于此模板开发。

如:网络请求里需要使用到认证的用户信息,此时需要在appDelegate内加入通用的OAuth方法打开主app获取授权的token等认证信息,在壳工程内请求里填充到对应的请求头或者body内完成认证,以避免再次引入登录和用户认证模块增大工程编译量。

技术实现关键:

官方推荐的pod lib create yourPodName 会被隐式转换为 pod lib create yourPodName --template-url=https://github.com/CocoaPods/pod-template.git, 故我们可以基于官方的template进行修改,做成自己的业务模块通用模板,使用--template-url参数指定模板来源

官方模板结构分析:

MyLib

├── .travis.yml ├── configure ├── LICENSE ├── NAME-osx.podspec ├── NAME.podspec ├── Pod │ ├── Classes │ ├── Assets ├── POD_LICENSE ├── POD_README.md ├── README.md ├── setup │ ├── ConfigureiOS.rb │ ├── ConfigureMacOSSwift.rb │ ├── ConfigureSwift.rb │ ├── MessageBank.rb │ ├── ProjectManipulator.rb │ ├── TemplateConfigurator.rb │ └── test_examples │ └── kiwi.m │ └── quick.swift │ └── specta.m │ └── xctest.m │ └── xctest.swift └── templates │ ├── ios │ └── Example
│ └── Podfile
│ └── PROJECT │ └── PROJECT.xcodeproj │ └── Tests
│ └── macos-swift │ └── Example
│ └──swift │ └── Example

以上为模板目录内的大致文件结构,可以很清晰的看到内部结构,主入口为configure,然后调用TemplateConfigurator.rb等相关脚本创建 相关脚本的各自功能: TemplateConfigurator.rb :询问用户是创建iOS还是macOS的类型,以及oc还是swift的类型,然后根据用户输入依次调用对应的脚本,此次将主要针对iOS oc的创建来说明 ConfigurationiOS.rb/ConfigureMacOSSwift.rb/ConfigureSwift.rb,然后执行以下操作 replace_variables_in_files #将类的注释替换为对应的日期,作者等 PROJCT_OWNER 替换为作者 PROJECT 替换为你创建的库名,TODAYS_YEAR,TODAYS_DATE 替换为日期 clean_template_files #清理临时文件 rename_template_files #重命名临时文件 add_pods_to_podfile #添加pod至podfile customise_prefix #批量重命名类前缀(CPD开头类) rename_classes_folder #文件夹重命名 ensure_carthage_compatibility #适配carthage用法 reinitialize_git_repo # run_pod_install #执行pod install安装工程

  @message_bank.farewell_message #完成后显示欢迎

ConfigurationiOS.rb 询问是否创建demo壳工程,由于我们正是要创建壳工程,所以perform方法这里注释掉直接keep_demo = :yes即可默认创建demo壳工程 询问是否使用单元测试框架,framework = :none 根据需求直接不使用即可 询问类前缀,此处保留,依各业务模块需求命名类前缀

ProjectManipulator.rb 先执行指定格式文本替换 @string_replacements = { "PROJECT_OWNER" => @configurator.user_name, #此处有一个注意点,当git配置为中文名时,会报错 "TODAYS_DATE" => @configurator.date, #修改为创建日期 "TODAYS_YEAR" => @configurator.year, #修改为创建年 "PROJECT" => @configurator.pod_name, #修改为你的lib名 "CPD" => @prefix #将CPD修改为你自己定义的前缀 } 再调用主要装配工程的脚本,原脚本写死了只有以下四个类会重命名并copy到创建的模板 ["CPDAppDelegate.h", "CPDAppDelegate.m", "CPDViewController.h", "CPDViewController.m"].each do |file| before = project_folder + "/PROJECT/" + file next unless File.exists? before

      after = project_folder + "/PROJECT/" + file.gsub("CPD", prefix)
      File.rename before, after

因为模板工程里需要加入我们自己的一些类,保证同时copy过去,需要先打开templates/ios/Example/project.xcodeproj工程,如普通项目一样向工程内添加代码,然后将生成的类重命名为CPD开头的类,保证重命名时能覆盖到 然后修以上copy和重命名的代码为 oriFiles = Dir[project_folder + "/PROJECT/*"] oriFiles.each do |file| puts "original file is " + file #log输出重命名前的类文件 puts "" before = file next unless File.exist? before after = file.gsub("CPD", prefix) puts "rename file is " + after #log输出重命名以后的类文件 puts "" 这样就会自动将该project目录下的所有文件重命名移动,不需要手动每个文件添加

针对以上添加入的CPD开头的文件,如果有使用了自己对应的pod库依赖的,在podfile里添加,并且注意在podfile头加入source避免找不到

最后根据pod lib create --template-url=yourGit 即可自动创建对应的模板类 已经修改好的demo模板地址:github.com/iPermanent/… 可以使用看效果,去除了平台提示,并直接使用oc,去除了swift语言提示以及单元测试框架的提示,只保留了输入类前缀的功能(默认集成了自己的HRCocoaTools/Category,仅用于示例,可自行去除)