目录
快速开始
一、制作二进制的步骤
1、copy一份源码到一个新目录,不要对源码直接修改
2、生成工程:使用工具cocoapods-project-gen
将网络引入和本地引入两种方式做了结合
3、编译工程
4、制作二进制包xcframework,上传到文件服务器
5、配置podfile文件,使用二进制
pod lib lint 做了哪些事?
从远程拉取代码
按照指定的平台分别生成xcode工程
对所有平台app进行编译
编译通过验证通过
二、工具cocoapods-project-gen
生成工程是重点,需要好好研究cocoapods-project-gen这个ruby项目
前期可以先使用,然后一点一点的研究
制作二进制包步骤
一、copy源码到指定目录
# 让当前的工作目录进入你指定的目录
Dir.chdir("/Users/lxy/Downloads/05-组件二进制化/上课代码/01-组件二进制化/AFNetworking-master")
# Pathname.pwd = /Users/lxy/Downloads/05-组件二进制化/上课代码/01-组件二进制化/AFNetworking-master
# 当前路径的上一层
# /Users/lxy/Downloads/05-组件二进制化/上课代码/01-组件二进制化
copy_path = Pathname.pwd.parent
# 拿到路径的最后一部分:AFNetworking-master
name = File.basename(Pathname.pwd)
# root = /private/tmp/cocoapods-bin
# /private/tmp/cocoapods-bin/AFNetworking-master
root_path = root.join(name)
# rm -rf /private/tmp/cocoapods-bin/AFNetworking-master
FileUtils.rm_rf(root_path)
# 如果没有创建目录:/private/tmp/cocoapods-bin
root.mkpath
# cp /Users/lxy/Downloads/05-组件二进制化/上课代码/01-组件二进制化/AFNetworking-master /private/tmp/cocoapods-bin
FileUtils.cp_r(Pathname.pwd, root)
二、生成工程
1、Cocoapods怎样引入Pod的?
方式一:按照podspec从网络下载,清理无关文件后,copy到Pods目录下使用,这是我们开发中最常用的方式
方式二:按照podfile文件中指定path的方式使用,这种方式不会清理无关文件,这是我们在开发调试三方库时最常使用的方式
这里有几个配置项需要说明下
# podspec文件的这个选项配置后pod就不会清理对应目录下的文件
s.preserve_paths = %w(include scripts)
# pod在download(也包括path引入的方式)完成之后会执行配置的脚本
spec.prepare_command = 'ruby build_files.rb'
cocoapods-core的文档去哪里查看
2、可以使用pod自带的工具生成工程
pod lib lint
这个命令会按照spec文件内容,从remote git 将代码拉取下来
按照文件内指定的平台(有可能是多个平台iOS,macOS),然后分别生成xcode工程
对生成的APP进行编译,编译通过则验证通过
3、三方工具
cocoapods-generate
A CocoaPods plugin that allows you to easily generate a workspace from a podspec.
这个工具在99%的场景下有效,但有一种场景会失败
在xcode中预处理一个.m文件,作用是把.h文件导入到.m文件里
import 引入头文件不会重复引用的前提是相同路径的头文件
比如有一个xx/test.h头文件,有一个yy/test.h头文件,那么引入两个test.h文件时是不会去重的。这是编译会报dupli错误
realm-swift-master 这个库在按本地方式引入完成时会执行一个脚本复制头文件,这样就会有两份头文件,在引入时就会冲突
cocoapods-project-gen
cocoapods工程下的
lint.rb文件内的 def run 方法
Validator.rb文件内的 def download_pod 方法
方法内的关键代码:
%i(prepare resolve_dependencies download_dependencies write_lockfiles).each { |m| @installer.send(m) }
# 对上边 download_pod 的方法进行了重写
cocoapods-project-gen工程下的
project_gen.rb文件内的 def handle_local_pod 方法
方法内的关键代码:
%i[prepare resolve_dependencies download_dependencies clean_pod_sources write_lockfiles].each do |m|
插入 clean_pod_sources 进行清理拷贝
cocoapods-project-gen核心思想是:
pob lib lint命令会走网络
但我本地已经有三方库的代码了,不用走网络。
所以cocoapods-project-gen拦截了下载,将本地的三方库copy到pods目录下,然后对文件进行清理(按照cocoapods的清理方式)
让cocoapods以为是已经下载完成了,继续走后续流程,也就是每一个platform都生成一个xcode工程
0.1.0版本的cocoapods-project-gen,目前是一个platform生成一个xcode工程
后续会优化成一个xcode工程下,有多个platform的target,减少重复的copy和清理的操作
行者常至,为者常成!