私有库
对于私有库
可以放在本地,也就是本地私有库
可以放在网络上,也就是远程私有库
当然,我们一般来说都是放在网络上,供同事使用,也就是远程私有库使用的更多一些
为了更好的学习远程私有库,我们一步一步来,学习下本地私有库
本地私有库
新建一个项目,然后在里面随便写一个分类,你会发现,项目中是可以引用该分类的。
现在,创建一个私有文件夹,将分类剪切到私有文件夹里面去,你会发现,项目运行不起来了(废话)
我们现在要做的就是:
如何让项目引用私有文件夹里面的分类,使得项目运行起来
首先,项目要使用git管理
包含的命令大致有:
cd 项目文件夹路径
git init
git add .
git commit -m 'init'
然后,将Base文件夹做成pod本地库
具体命令:
cd 项目文件夹路径
git init
git add .
git commit -m 'init'
pod spec create FMBase(创建的库的名字)
然后修改.spec文件,大致与上面的都一致,略有不同的是:
spec.homepage
因为没有,所以不需要改
spec.license = "MIT"
source没有,设为空
spec.source = { :git => "", :tag => "#{spec.version}" }
至此,对于.spec的文件修改就完毕了
最后,回到项目中,项目使用CocoaPods管理
pod init
修改Podfile文件,使得Podfile可以引用到本地私有库
pod '某A库'
会去官网URL中检索A库是否存在
而官网地址,也就是索引库地址可以通过pod repo
命令,查看podd的索引源(就是第三方库检索地址)
运行结果类似于:
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/admin/.cocoapods/repos/trunk
假如我们pod '某B私有库'
,显然,在官网URL是找不到该B私有库的
因此,我们使用:
pod '某B私有库', : path => '私有库地址'
指明私有库的地址
结合到本例子:
pod 'FMBase', :path => '../localLib/FMBase'
然后pod install
pod install
Analyzing dependencies
Downloading dependencies
Installing FMBase (0.0.1)
Generating Pods project
Integrating client project
引入本地私有库成功!
存在的问题
有个问题,这样是可以引用本地私有库,但组件化的目的之一是可以单独测试,那之前建立的本地私有库,是无法进行单独测试的。
因此,我们要做的是:
将本地私有库做成单独的工程,满足测试独立
方法一:直接在私有库文件夹同级目录下创建一个Example项目工程,然后将category组件引用过来。需要注意的是,不要勾选Copy items if needed
然后,就可以在Example项目工程中测试、修改category组件了
方法二:也是同级目录下创建一个Example项目工程,只是将Example使用CocoaPods管理,然后使用CocoaPods引入category组件。
其实这种方法,跟引入到主项目里面的操作是一样的
方法三:创建pod模板库
pod lib create 名字
创建pod库模板库功能
遇到的问题:
pod lib create XMGFMBase可以
pod lib create FMBase不可以(我的工程Lib就是FMBase)
解决办法:
删除有的文件夹,重写创建
然后,终端里面会让输入:
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?//前缀
> YZ
你会发现,多了一个文件工程
该Podfile里面的内容
跟我们手动建立Example工程是一样的
此时,Example里面的Pods里面的FMBase里面的ReplaceMe就是工程外面的ReplaceMe
我们将ReplaceMe删除,然后将category组件化的文件夹放入Classes里面
然后cd到Example,之后只需要pod install
即可
遇到的问题:
我明明把文件夹category拷贝过去了,而且从项目中查看文件夹路径也有category文件夹,但是项目中却不显示,如上图所示
远程私有库
大致步骤:
首先,我们一般下载的都是Git的官方库,如果需要下载私有库的东西,需要指定私有库地址
如何添加远程私有索引库?
pod repo
可以看到当前的索引库源
使用pod repo --help
可以查看帮助命令
其中
+ add Add a spec repo
也就是,pod repo add 起个名称 私有库地址
可以添加一个索引库
-
在gitHub上创建一个私有项目,得到地址
-
添加私有索引库地址:
pod repo add YZFMBase https://github.com/../YZFMSpecs.git
-
使用
pod repo
可以看到,新的私有索引库已经添加完毕
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/admin/.cocoapods/repos/trunk
YZFMBase
- Type: git (main)
- URL: https://github.com/../YZFMSpecs.git
- Path: /Users/admin/.cocoapods/repos/YZFMBase
也可以去本地索引文件里面查看
/Users/admin/.cocoapods/repos/YZFMBase
接下来要做的:
将 组件化代码 上传到 远程私有库
将.spec描述文件提交到
- 创建一个远程私有库,用来存放本地写的项目代码(这些就是组件化代码,可能就是一个基础组件,本例子就是一个简单的分类)
- 创建一个模板库(模板库的目的是可以组件化的独立测试)
pod lib create FMBase
这次成功了
-
将ReplaceMe.m文件使用category文件夹替换掉
-
本地项目的Example执行
pod install
进行安装,现在项目中已经出现了分类 -
修改.spec文件
主要是s.homepage与s.source的修改
在.spec文件夹目录下,可以通过命令pod lib lint
验证.spec文件里面内容有无错误
pod lib lint
是本地验证
pod spec lint
是远程验证 -
本地代码上传到私有库(本地库与远程库关联起来)
git add .
git commit -m '添加写好的组件'
git remote//查看是否关联了远程地址
git remote add origin https://github.com/../YZFMBase.git
git remote//查看是否关联了远程地址
git push origin master
好神奇,别人也可以直接使用CocoaPods安装我写的库了
- 打标签
git tag '0.1.0'(该版本号需要与.spec版本号保持一致)
git push --tags
- 将.spec文件提交到远程私有索引库中
这样别人就可以通过查找私有库里面的.spec找到你的项目代码下载地址
pod repo push YZFMBase FMBase.podspec
YZFMBase远程要提交的私有库名字
FMBase.podspec本地的.spec文件
问:为什么是YZFMBase文件夹名字,而不是一个私有索引库地址?
这是因为,.spec文件push到本地的YZFMBase文件夹,会自动找到并更新远程的私有索引库地址里面的.spec文件
遇到的问题:
使用pod repo push YZFMBase FMBase.podspec
命令报错:
[!] TheFMBase.podspec
specification does not validate.使用
pod repo push YZFMBase FMBase.podspec --allow-warnings
命令成功
现在,直接在终端检索自己写的库:
pod search FMBase
使用
原理引用本地私有库需要这样写:
: path => '私有库地址'
现在不需要了,直接添加source即可:
source 'https://github.com/../YZFMSpecs.git'
私有库
source 'https://cdn.cocoapods.org/'
官方库
执行pod install
大致流程如下图所示:
流程不清楚的可以回顾第14-远程私有库升级的前10分钟
讲完了本地私有库和远程私有库的配置
假如你修改了库,然后想升级下库,这时该怎么办呢?
接下来我们一起来学习:
远程私有库的升级维护
- 在本地项目中进行你的修改,然后
pod install
可以看到添加的文件
神奇的是,之前category文件夹没有,现在居然又有了,简直了
因为对原项目进行了修改,等于是升级了,需要修改.spec的版本号
- 修改.spec的版本号
- 提交修改
git add .
git commit -m '修改'
git push origin master
- 打标签 并 上传
git tag '0.2.0'
git push --tags
现在代码库里面的.spec已经是最新的了,但是检索库里面的.spec不是最新的,需要把最新的.spec更新到检索库里面的.spec
- 更新检索库的.spec
pod repo push YZFMBase FMBase.podspec --allow-warnings
然后,回到主项目,更新pod update --no-repo-update
即可
pod update --no-repo-update
:不需要更新repo库
SDK更新成功
第三方库的正确使用
对于第三方框架,可以直接使用,但最好做一层封装
比如AFNetworking或者SDWebImage,都可以再做一层封装,在使用的时候,使用自己写的封装,而不是直接使用第三方框架里面的api
这样虽然麻烦一点,但是后期换框架或者升级框架的时候就简单很多
就比如之前的SDWebImage,后期加了前缀sd_…,如果之前是对其封装过一层,改起来很快,如果没有封装过,那就得代码里一个一个改了。
组件库里面依赖其他第三方库怎么办?
比如,我在组件代码里面依赖了一个AFNetworking和SDWebImage,这时该如何操作?
在.spec文件中,里面有这个s.dependency 'AFNetworking', '~> 2.3'
也就是当前库s依赖其他库AFNetworking
如此,在私有检索库里面,找到.spec文件,检测到里面依赖其他库,则会自动将其也下载下来
虽然在Podfile文件里面没有写相应的库
但,因为有依赖,在pod install
后,里面仍有两个库
然后按照上面的流程即可操作成:
优化
有个问题,比如在组件中我写了10个库,我在项目A中只需要前两个库,而项目B中只需要最后两个库,那,我在项目A中使用的时候,按照上面的做法,会把组件里面写的10个库都下载下来,这是没必要的,我们仅需要前2个即可。
如何做到需要哪一个下载哪一个呢?
我们在使用命令pod search AFNetworking
时,会看到:
Subspecs:子库
如果你只想使用AFN里面的某一个功能,只需要引入对应的子库即可,没有必要把整个AFN库引入到项目里面。
在使用的时候
pod 'AFNetworking/Reachability'
即可
这就是我们想要的
因此,我们也要将组件里面的库,做划分,分为不同的subspeces子库
对.spec做修改,添加subspec:
//里面的总路径不需要了,注掉
#s.source_files = 'FMBase/Classes/**/*'
//起个名字category
//起个别名c
//c.source_files必须写对
s.subspec 'category' do |c|
c.source_files = 'FMBase/Classes/category/**/*'
end
s.subspec 'UIFont' do |f|
f.source_files = 'FMBase/Classes/UIFont/**/*'
end
另外,子库里面谁依赖其他库,把依赖写在子库里面
不要忘记修改版本号
如此,
如果你想按照全部,还是pod 'FMBase'
如果你想按照某一个,则只需要按照某一个即可pod 'FMBase/category'
pod 'FMBase/category'
pod 'FMBase/UIFont'
这种写法与下面这种写法等价
pod 'FMBase', :subspecs => ['category', 'UIFont']
学习完基础组的相关制作、更新操作
我们来学习下功能组件的制造