记载自己怎么创建私有组件的,途中遇到的问题一起贴出。做个笔记,便当之后忘掉哪那一步了回头来看一下

一.组件的创建

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

承认之后,系统会为你自动装备组件项目,创建好的项目如下

iOS - 组件化(一): 组件的创建

iOS - 组件化(一): 组件的创建
这个 Example 现已为你的组件创建了索引文件 podspec,并且集成了该组件。

我们来看下 ExamplePodfile 的内容:

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 主目录下:

iOS - 组件化(一): 组件的创建

这个文件夹下,一个寄存你的各种类文件,一个寄存图片资源等。

1.2podspec 文件

在你回答之前问题之后,pod 为你自动创建了该文件,并实行了 pod install 指令,该指令会找到组件的索引文件(也在本地) MSDNetWorking.podspec:

iOS - 组件化(一): 组件的创建

#
# 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

iOS - 组件化(一): 组件的创建
这样,我们就设置好了同享的内容,即组件开发好了。接下来,我们运用 Example 工程来运用这个组件的内容

终端进入 Example 工程目录下,实行 pod install 指令来装置组件。

iOS - 组件化(一): 组件的创建

我们发现,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 工具的别的一个长处便是,多个组件依托同一个组件时,它会自动帮你检测装置,而不会重复导入。

iOS - 组件化(一): 组件的创建

我们发现 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,又或许是 GitHubCoding 等途径。

五.相关远程仓库

在模版 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

iOS - 组件化(一): 组件的创建

推送失利那就暴力推送掩盖吧(第一次仓库无任何代码)

git push -f origin master

iOS - 组件化(一): 组件的创建

回到 Gittee 改写一下即可看到你的提交记载。

六.打 tag发送到远程仓库

我们现已成功的将本地仓库相关并推送到远程仓库,现在我们要发布一个可用的组件。

  • 首要我们要给当时项目打一个 tag 版别号,在 podspec 中:
s.version = '0.1.0'
  • 指定的版别号是 0.1.0,那么我们就相同打个 0.1.0tag:
git tag 0.1.0 // 打 tag $ git push --tags // 推送到远程
  • 改写页面,项目的 release 选项中会出现刚刚打的版别。

iOS - 组件化(一): 组件的创建

iOS - 组件化(一): 组件的创建

七.发布到 CocoaPods

7.1.验证

由于我们创建的项目以及标签的版别号都是沿用了 podspec 文件中的信息,因此可以直接验证 podspec 文件信息是否可以通过验证,假设需求调整,调整之后最好相同先验证: 留意

podspec 文件的版别号必定要和 tag 保持一致。

pod spec lint

我运用这个给报错了

iOS - 组件化(一): 组件的创建

换了一种方法

pod lib lint MSDNetworking.podspec –allow-warnings –use-libraries

完美!!!!!

iOS - 组件化(一): 组件的创建

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

iOS - 组件化(一): 组件的创建

收到邮件

iOS - 组件化(一): 组件的创建

去验证

iOS - 组件化(一): 组件的创建

这样就验证成功了

现在,就可以将 podspec 提交给 CocoaPods 了。这个文件将是他人查找你的组件的索引。

pod trunk push MSDNetworking.podspec --allow-warnings

iOS - 组件化(一): 组件的创建

这样就上传成功了

7.3.查找

上传结束之后,接可以通过 pod search MSDNetworking 查找到自己的组件了

iOS - 组件化(一): 组件的创建

没搜到?

没搜到别慌 !

删去本地的查找文件试试

rm ~/Library/Caches/CocoaPods/search_index.json

只实行了这行指令依然搜不到

别慌!

1.更新本地pod库

pod repo update

问题出在这儿 远程的索引库没找到

iOS - 组件化(一): 组件的创建

删去本地查找索引文件

rm ~/Library/Caches/CocoaPods/search_index.json

从头建立查找

pod search MSDNetworking

iOS - 组件化(一): 组件的创建

完美搜到了!

八.集成到宿主工程

我们现已结束了网络组件的创建和发布,也支撑了 CocoaPods 的集成。现在我们需求将该组件集成到宿主工程中去,这部分没什么好提的,因为运用方式和集成三方库是相同的,可以说三方库只不过是他人编写的功用组件罢了,我们的组件相同可以提供给小组成员运用,比较于朴实的三方库,我们的许多组件都相关了业务部分,或许基于私家的其他组件,因此适用范围较小。