iOS 组件化(一) - CocoaPods原理理论篇
iOS 组件化(二) - 远程/本地管理私有库
iOS 组件化(三) - 组件化工程先容
一、前言
1.相识组件化
组件化就是将单一工程的项目按照功能职责大概业务职责分别成一个一个模块,模块间解耦调用。
2.组件化办理耦合标题
当一个项目开辟初期的时间,开辟人员较少,业务较为简单,此时接纳单一工程开辟的模式,能保证开辟效率。当项目越来越大,开辟人员越来越多,单一工程开辟就会有一些弊端,诸如:
- 代码耦合严峻
- 提交轻易出现辩论
- 编译时间太长导致开辟效率低
- 代码冗余严峻(雷同功能代码可能反复被实现)
3.组件化的优点
- 加快编译速率,不必要编译整个项目(每个组件都有一个壳工程)
- 方便做针对性测试
- 代码解耦后更利率开辟职责的分别
- 不轻易出今世码提交辩论
4.利用组件化面对的标题
不是全部APP都得当走组件化的路子,盲目的为了组件化而组件化反而会由于各种缘故起因导致开辟效率变低。比方一个两三个人维护业务简单的项目,组件化的解耦调用可能会导致代码逻辑变复杂。组件化粒度过细也会一个业务需求必要修改多个组件也轻易让代码追踪变得困难,与对应组件负责人的沟通也会拖慢开辟的进度。业务简单项目易管理就不必要用到组件化了。
二、远程私有索引堆栈
1.创建远程私有索引堆栈
我这里以码云平台为例
就像我们在公司创建项目一样,我这里就叫WJSpec
(最好勾选readme功能成利用阐明文件)
创建完后就可以得到下载链接 https://gitee.com/xxx/WJSpec.git
2.将远程堆栈Spec关联到本地的repos里
终端定位到CocoaPods的repos,而且举行关联
$ cd /Users/用户名/.cocoapods/repos $ pod repo add WJSpec https://gitee.com/xxx/WJSpec.git实验乐成后,我们可以看到repos目次下就拥有我们自己的私有索引库了
至此远程私有索引堆栈创建就完成了。
接下来要天生我们的组件啦。
三、私有组件工程(本地和远程)
1.创建本地私有代码
在桌面创建一个名为Modules的文件夹,打开终端利用pod下令创建组件工程,取名为WJCommon
cd /Users/xxx/Desktop/Modulespod lib create WJCommon
竣事之后会天生一个工程 (Example是可运行的工程项目)
将组件的代码文件拷贝到Classes
将组件的资源文件(如png、xib)拷贝到Assets
(下一章节还会具体先容组件的各个设置和组件依靠等等)
修改组件工程里的WJCommon.podspec文件:
自行修改对应的远程组件工程的地点
(PS:WJCommon的远程组件地点的天生部分内容在下面)
Pod::Spec.new do |s| s.name = 'WJCommon' # 库名称 s.version = '0.0.1' # 版本号 s.summary = 'Swift 工具类组件' #对组件的简述# This description is used to generate tags and improve search results.# * Think: What does it do? Why did you write it? What is the focus?# * Try to keep it short, snappy and to the point.# * Write the description between the DESC delimiters below.# * Finally, don't worry about the indent, CocoaPods strips it! #对组件的形貌 s.description = <<-DESCTODO: Add long description of the pod here. DESC #此处为远程堆栈地点,要去掉 /xxx.git s.homepage = 'https://gitee.com/xxx' # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' s.license = { :type => 'MIT', :file => 'LICENSE' } #作者邮箱 s.author = { '作者名称' => 'xxx@qq.com' } #库地点、当前的版本号 s.source = { :git => 'https://gitee.com/xxx/WJCommon.git', :tag => s.version.to_s } # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' s.ios.deployment_target = '10.0' # 依靠最低版本 # 开放的库文件 s.source_files = 'WJCommon/Classes/**/*' # 开放的库资源文件 - 有资源则必要打开这里的解释 # s.resource_bundles = { # 'WJCommon' => ['WJCommon/Assets/*.png'] # } # s.public_header_files = 'Pod/Classes/**/*.h' # s.frameworks = 'UIKit', 'MapKit' # 组件所依靠的体系框架 s.dependency 'AFNetworking' # 组件所依靠的三方库 如AFNetworking等等end2.创建远程组件代码库
1.在码云上创建一个远程组件代码库
其操纵与 远程私有索引堆栈的操纵是一样的,我将创建的远程组件代码库定名为WJCommon,既可以得到其地点: https://gitee.com/xxx/WJCommon.git
2.将本地的WJCommon工程代码提交到远程WJCommon组件代码库
cd /Users/xxx/Desktop/Modules/WJCommongit remote add origin https://gitee.com/xxx/WJCommon.gitgit push -u origin master -fgit add .git commit -am "提交接码"git push -u origin master -fgit tag 0.0.1#(留意,这里的tag必须和WJCommon.podspec文件的版本同等)git push --tags3.对文件举行本地验证和远程验证
$ pod lib lint --allow-warnings # 本地认证本地认证乐成如下
$ pod spec lint --use-libraries --allow-warnings # 远程认证4,将本地的WJCommon.podspec文件推送到本地CocoaPods/repos索引库
pod repo push WJSpec WJCommon.podspec --use-libraries --allow-warnings #(假如前面一步加了--use-libraries --allow-warnings 此时务必加上,不加会报错)此时我们的本地WJSpec就有了该组件的信息了
检察远程堆栈是否有我们的WJCommon组件
$ pod search WJCommon至此远程组件化就集成完成了。
5.拓展常用附加处理处罚
- 检察具体信息,请在下令后到场--verbose
- 忽略告诫,请在下令后到场--allow-warnings
- 利用本地库,请在下令后到场--use-libraries
- 检查全部标题,请在下令后到场 --no-clean
- 依靠了私有库,必要添加源,请在下令后到场 --sources= (留意假如依靠了公有库,还必要添加公有库源:https://github.com/CocoaPods/Specs 即 --sources=私有库名,https://github.com/CocoaPods/Specs)
留意:肯定要添加上https://github.com/CocoaPods/Specs.git
pod lib lint --allow-warnings --sources=https://gitee.com/xxx/WJSpec.git,https://github.com/CocoaPods/Specs.git三、验证是否可以或许集成
在我们的项目中利用WJCommon组件
1.在Podfile文件头部声明source源
source "https://gitee.com/xxx/WJSpec.git"
2.在Podfile文件中对应的项目target添加pod WJCommon
假如想更新库的版本而且推奉上去,则必要重新修改版本号并提交 流程如下:
#A、工程中修改你要修改的代码等。#B、.podSpec文件中修改版本号,设置成你此次修改的版本,然后打tag,推送到远端。cd /Users/xxx/Desktop/Modules/WJCommongit push -u origin mastergit add .git commit -am "提交0.0.2版本"git push -u origin mastergit tag 0.0.2 # 新的版本git push --tagspod repo push WJSpec WJCommon.podspec --use-libraries --allow-warnings四、常见标题(error)
标题1: 校验失败
** BUILD FAILED **The following build commands failed: CompileSwift normal x86_64 CompileSwiftSources normal i386 com.apple.xcode.tools.swift.compiler CompileSwift normal i386 CompileSwift normal arm64(4 failures)Testing with `xcodebuild`. 办理办法:在.podspec文件中到场;参考iOS 指令集架构
s.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 arm64' }标题2: 组件中依靠的第三方库中有framework大概.a文件, pod install 报错:
target has transitive dependencies that include statically linked binaries:办理办法: 在podfile文件中到场以下代码:
pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}end标题3: Xcode setting ENABLE_BITCODE
You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE) 办理办法:将target下 ENABLE_BITCODE 设置为 NO
参考文档:
CocoaPods官方制作文档
用 CocoaPods 私有库进步团队的团体效率
GitHub 将利用 main替换掉 master等术语 |