记录自己如何创建私有组件的,途中遇到的问题一并贴出。做个笔记,方便之后忘记哪那一步了回头来看一下
一.组件的创建
1.拉取模版
我们将创建在桌面上的一个名为 Demo
文件夹中。通过终端进入到该文件夹下,然后输入命令:
pod lib create MSDNetworking
// 作用的平台
What platform do you want to use?? [ iOS / macOS ] > iOS
// 语言环境
What language do you want to use?? [ Swift / ObjC ] > ObjC
// 是否需要一个 demo 用来测试组件
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None Would you like to do view based testing? [ Yes / No ]
> Yes
// 组件中,文件的前缀
What is your class prefix? > MSD
确认之后,系统会为你自动配置组件项目,创建好的项目如下
这个
Example
已经为你的组件创建了索引文件 podspec
,并且集成了该组件。
我们来看下 Example
的 Podfile
的内容:
use_frameworks!
platform :ios, '9.0'
target 'MSDNetWorking_Example' do
pod 'MSDNetWorking', :path => '../'
target 'MSDNetWorking_Tests' do
inherit! :search_paths
pod 'FBSnapshotTestCase'
end
end
其中为你集成了一个测试用例 pod 'FBSnapshotTestCase'
,目前可以忽略
我们可以看到: pod 'MSDNetWorking', :path => '../'
这一句,path
路径指向了本地路径,对应 MSDNetWorking 主目录下:
这个文件夹下,一个存放你的各种类文件,一个存放图片资源等。
1.2podspec 文件
在你回答之前问题之后,pod 为你自动创建了该文件,并执行了 pod install
命令,该命令会找到组件的索引文件(也在本地) MSDNetWorking.podspec:
#
# Be sure to run `pod lib lint MSDNetWorking.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'MSDNetWorking' #组件工程名
s.version = '0.1.0' #组件版本号
s.summary = 'A short description of MSDNetWorking.' #对组件的描述
# 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 = <<-DESC
TODO: Add long description of the pod here.
DESC
#远程仓库地址
s.homepage = 'https://github.com/MaShudong/MSDNetWorking'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'MaShudong' => 'first_msdong@163.com' }
s.source = { :git => 'https://github.com/MaShudong/MSDNetWorking.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '9.0'
s.source_files = 'MSDNetWorking/Classes/**/*'
# s.resource_bundles = {
# 'MSDNetWorking' => ['MSDNetWorking/Assets/*.png']
# }
# s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3' #s.dependency是该组件所需要依赖的其他组件、三方组件等。
end
该文件为你的组件自动配置了一些基本的信息,当然这些信息是需要你根据情况修改的,更多的配置你可以搜索相关文档。
> 注意:这里的 Git 地址目前是找不到的,后期需要自己关联。
二.设置共享文件
podspec
文件中 s.source_files = 'MSDNetworking/Classes/**/*'
指代共享的资源路径,我们需要将共享的文件放到这里来。
我们打开组件的目录查看,可以看到这里已经有了名为 ReplaceMe
的文件了,这暗示你用共享文件替换它。
podspec
文件中还有一个被注释掉的:
# s.resource_bundles = { # 'MSDNetworking' => ['MSDNetworking/Assets/*.png'] # }
我们来创建一个 MSDNetworking 类:
@interface MSDNetworking : NSObject -(NSString*)getSomething;
@end @implementation MSDNetworking
-(NSString *)getSomething{ return @"test method."; }
@end
将其移动到组件的共享目录下并删除掉空文件ReplaceMe
:
这样,我们就设置好了共享的内容,即组件开发好了。接下来,我们使用
Example
工程来使用这个组件的内容
终端进入 Example
工程目录下,执行 pod install
命令来安装组件。
我们发现,Example
项目中 Pods/Development Pods/MSDNetworking
下,多出来最新添加的文件
三.使用组件
我们安装好组件之后来使用一下组件的功能,就像使用三方库那样:
#import "MSDViewController.h"
#import "MSDNetworking.h"
**@interface** MSDViewController ()
**@end**
**@implementation** MSDViewController
- (**void**)viewDidLoad
{
[**super** viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (**void**)didReceiveMemoryWarning
{
[**super** didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (**void**)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
MSDNetworking * working = [[MSDNetworking alloc] init];
NSLog(@"%@",[working gerSomething]);
}
控制台输出:
**2022-01-10 15:03:44.293512+0800 MSDNetworking_Example[2879:175584] test something**
这表示功能正常。
在组件开发过程中,使用 pod 'MSDNetworking', :path => '../'
将路径指向本地是很有必要的,方便测试你的组件配置是否正确,功能是否完善,相比推到远程、发布再集成,这方便太多了。
四.三方依赖库
有时候,我们的组件还依赖其他的组件,又或者是三方库。我们通过 s.dependency
字段去设置,多个库可以分开写多次。
Analyzing dependencies Fetching podspec for `MSDNetworking` from `../` Downloading dependencies Installing AFNetworking (3.4.0) ……
我们发现,Example
自动拉取了组件 MSDNetworking 所依赖的其他组件。CocoaPods
工具的另外一个优点就是,多个组件依赖同一个组件时,它会自动帮你检测安装,而不会重复导入。
我们发现 Example
工程的 Pods
中,本地开发的组件和远程发布的组件被分别放在了不同的目录下。
有了 AFNetworking
之后,你就可以修改你的网络请求组件了
#import "MSDNetworking.h"
**@implementation** MSDNetworking
- (NSString *)gerSomething{
**return** @"test something";
}
#pragma mark **- GET请求,请求头不带参数的**
-(**void**)GET:(NSString *)URLString parameters:(NSDictionary *)parameters success:(Success)success failure:(Failure)failure{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",@"application/json", **nil**];
[manager GET:URLString parameters:parameters headers:parameters progress:^(NSProgress * **_Nonnull** downloadProgress) {
} success:^(NSURLSessionDataTask * **_Nonnull** task, **id** **_Nullable** responseObject) {
;
} failure:^(NSURLSessionDataTask * **_Nullable** task, NSError * **_Nonnull** error) {
}];
}
@end
修改好之后,还不能直接在 Example
中使用,需要卸载组件再重新安装。注释掉 pod 'MSDNetworking', :path => '../'
之后执行 pod install
即可完成卸载。
至此,就完成了组件的创建、文件共享、本地化测试使用和更新。但是,我们的组件毕竟是要服务于宿主工程的,如果仅仅只能是通过本地集成,那意义不大,我们要将其关联到远程服务器,推送到本地搭建的 gitee
,又或者是 GitHub
、Coding
等平台。
五.关联远程仓库
在模版 podspec
文件中,已经帮我们指定了一个 gitee
的仓库地址(个大平台自己创建,创建过程就不描述了)
你可以使用它或者进行修改它。我们这里选择使用它,先去 gitee
创建对应的仓库。
在最初创建组件时,系统已经帮我们创建好了本地 Git 仓库
可以通过
ls -la //进行查看
如果没有,你可以使用命令 git init
创建一个。
- 现在,我们要将之前的修改进行提交(本地提交)。
git commit -am "第一次提交"
- 添加关联远程仓库
git remote add origin https://gitee.com/********/msdnetworking.git
- 将本地内容推送到远程仓库
git push -u origin master
推送失败那就暴力推送覆盖吧(第一次仓库无任何代码)
git push -f origin master
回到 Gittee
刷新一下即可看到你的提交记录。
六.打 tag
发送到远程仓库
我们已经成功的将本地仓库关联并推送到远程仓库,现在我们要发布一个可用的组件。
- 首先我们要给当前项目打一个
tag
版本号,在podspec
中:
s.version = '0.1.0'
- 指定的版本号是
0.1.0
,那么我们就同样打个0.1.0
的tag
:
git tag 0.1.0 // 打 tag $ git push --tags // 推送到远程
- 刷新页面,项目的
release
选项中会出现刚刚打的版本。
七.发布到 CocoaPods
7.1.验证
由于我们创建的项目以及标签的版本号都是沿用了 podspec
文件中的信息,因此可以直接验证 podspec
文件信息是否可以通过验证,如果需要调整,调整之后最好同样先验证:
注意
podspec
文件的版本号一定要和 tag
保持一致。
pod spec lint
我使用这个给报错了
换了一种方法
pod lib lint MSDNetworking.podspec --allow-warnings --use-libraries
👌完美!!!!!
7.2.发布
现在可以将 podspec
文件提交到 CocoaPods
上了:
首先要通过 trunk
注册生成一条会话:
// pod trunk register 邮箱 用户名 描述
pod trunk register first_msdong@163.com XIAOMAGE1105 --description=NETWORKINGDEMON
[!] Please verify the session by clicking the link in the verification email that has been sent to first_msdong@163.com
收到邮件
去验证
这样就验证成功了
现在,就可以将 podspec
提交给 CocoaPods
了。这个文件将是别人搜索你的组件的索引。
pod trunk push MSDNetworking.podspec --allow-warnings
👌🏻 这样就上传成功了
7.3.搜索
上传完成之后,接可以通过 pod search MSDNetworking
搜索到自己的组件了
没搜到?👃🏻
没搜到别慌 !
删除本地的搜索文件试试
rm ~/Library/Caches/CocoaPods/search_index.json
只执行了这行命令仍然搜不到
别慌!
1.更新本地pod库
pod repo update
问题出在这里 远程的索引库没找到
删除本地搜索索引文件
rm ~/Library/Caches/CocoaPods/search_index.json
重新建立搜索
pod search MSDNetworking
👌👌👌 完美搜到了!
八.集成到宿主工程
我们已经完成了网络组件的创建和发布,也支持了 CocoaPods
的集成。现在我们需要将该组件集成到宿主工程中去,这部分没什么好提的,因为使用方式和集成三方库是一样的,可以说三方库只不过是他人编写的功能组件而已,我们的组件同样可以提供给小组成员使用,相比于纯粹的三方库,我们的许多组件都关联了业务部分,或者基于私人的其他组件,因此适用范围较小。