一般我们制作的pod公有库或者是私有库都放在远程,并且每次修改都需要push;如果仅仅是放在本地进行调试的模块/组件,那么对应的podfile文件以及podspec应该如何编写呢?
1、搭建测试项目以及framework
1)先创建一个测试项目
2)创建一个framework,放到和测试项目同一个目录下
3)再创建一个类MTPopView
4)关掉MTPopView,然后在MTShopList项目中通过Add Files添加MTPopView
5)按照正常的target相互调用那样,添加framework,以及import MTPopControl
6)编译MTShopList报错
需要在class MTPopView前面加上public
再编译运行就ok了。
这里swift报错原因大家应该是很熟悉了;swift访问权限总共有private、fileprivate、internal、public、open 5种,默认情况下是internal修饰,而我们目前是2个不同的target进行访问,属于不同的模块,所以另一个target无法访问,需要修改访问权限为public即可(这里能否用open,它们的区别你知道吗?)。
2、编写pod文件
1)如何编写本地测试的podspec?
通过命令pod spec create MTPopControl生成自动的podspec文件,然后替换以及删除自己不想要的命令;这里就直接简化写了,如下:
Pod::Spec.new do |spec|
spec.name = "MTPopControl"
spec.version = "0.0.1"
spec.summary = "A short description of MTPopControl."
spec.homepage = "http://EXAMPLE/MTPopControl"
spec.license = "MIT"
spec.author = { "xk" => "" }
#远程push的写法
#spec.source = {:git => 'https://github.com/xxx/xxxxx.git', :tag => spec.version}
spec.source = { :path => '.' }
spec.source_files = "MTPopControl"
spec.requires_arc = true
spec.swift_version = "5.0"
spec.ios.deployment_target = "11.0"
end
主要是关注属性spec.source的写法不同了,我们这里是本地
官方的示例:
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
这个时候就不能通过命令 pod lib lint-本地验证你的pod是否有效,会报错的,因为我们这里是本地路径。
xk$ pod lib lint MTPopControl
-> MTPopControl
- ERROR | spec: The specification defined in `MTPopControl` could not be loaded.
Is a directory @ io_fread - MTPopControl
[!] MTPopControl did not pass validation, due to 1 error.
You can use the `--no-clean` option to inspect any issue.
2)podfile如何编写?
首先删除framework对应的target
关闭项目MTShopList
在项目MTShopList路径下,通过命令:
xk$ pod init
打开Podfile文件,添加内容:
# Pods for MTShopList
pod 'MTPopControl', :path => '../MTPopControl'
再安装:
xk$ pod install
3、验证测试
打开生成的workspace,这个时候就能看到pod对应的project比我们平时的项目多了一个Development Pods文件夹,里面放的就是刚导入的framework。
编译运行项目Succeeded!
最后:本文采用这种Pod开发方式的好处就是可以一个人快速开发调试,不用每次修改完依赖库都把podspec 以及对应的库 push上去,有时候网络不稳定的情况下会等很久,影响开发效率;待最后调试的模块/组件稳定后或是多人开发还是需要制作成私有库push上去,进行统一版本管理。
参考文献: