组件化开发操作流程

一、远程私有索引库创建(WeyanSpec)

1、创建远程私有索引库WeyanSpec(和创建远程工程一样),复制仓库地址(点击克隆/下载)


2、打开终端,将远程私有库关联到本地

cd ~/.cocoapods/repos
pod repo add WeyanSpec git@github.com:Yxw9106/WeyanSpec.git

这个时候~/.cocoapods/repos目录下面多了个WeyanSpec目录


二、私有代码仓库

1、创建文件夹EncryptionTools
2、本地私有代码库

# cd到指定的目录,这个EncryptionTools是自己创建的一个文件目录
cd /Users/xieweiyan//EncryptionTools 
# 这里的EncryptionTools代表想要封装的组件名称, 这个根据自己的需求而定
pod lib create EncryptionTools

2.1、 在输入之后会有一些对组件工程的设置,具体如下:

What platform do you want to use?? [ iOS / macOS ]
>iOS

//开发语言设置,根据自己而定,这里为ObjC
What language do you want to use?? [ Swift / ObjC ]
>ObjC 

//是否需要创建一个demo用来测试你的组件,这里选择Yes,是为了之后对写好的组件进行测试
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 ]
>No 

//文件前缀
What is your class prefix?
>Weyan

2.2、创建完成过后,我们的工程会自动打开,创建完成后,工程的目录如下:


可以发现在Pods文件下面现在有一个EncryptionTools的文件夹,就是我们上面pod lib create EncryptionTools时候创建的文件夹名

2.3、添加功能的代码copy到Classes 目录中新建的EncryptionTools目录下,如下图所示



2.4、将添加的组件文件Pod到Example文件夹中

  • 进入EncryptionTools>Example文件夹(有Podfile的文件夹)
  • 执行 pod install 命令
  • 执行完成后的工程目录
  • 组件文件出现在Pods的工程中

    2.6、配置.podspec文件,打开工程中的EncryptionTools.podspec文件
#
# Be sure to run `pod lib lint EncryptionTools.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             = 'EncryptionTools'  //1、组件名称
  s.version          = '0.1.0'  //2、版本
  s.summary          = 'A short description of EncryptionTools.' //3、组件描述

# 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/xwy/EncryptionTools' //4、更换为github的仓库地址
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' } //5、监听
  s.author           = { 'xwy' => '17639605676@163.com' } //6、作者
  s.source           = { :git => 'https://github.com/xwy/EncryptionTools.git', :tag => s.version.to_s } //7、项目的远程仓库地址
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0' //8、iOS支持版本
  #s.swift_version = '5.0' //如果组件使用swift语言开发的就要设置swift版本
  s.source_files = 'EncryptionTools/Classes/**/*' //9、组件文件路径
  
  # s.resource_bundles = {
  #   'EncryptionTools' => ['EncryptionTools/Assets/*.png']
  # } //10、资源包 

 s.public_header_files = 'Pod/Classes/**/*.h' //11、组件文件路径
 #s.private_header_files = 'EncryptionTools/Classes/Core/EncryptionTools-Bridging-Header.h' //12、如果有桥接文件时设置
 s.frameworks = 'UIKit', 'MapKit' 
  # s.dependency 'AFNetworking', '~> 2.3' //13、依赖库,如果组件有依赖于其它组件,则需要放开此处注释,将组件引用进来,并且同时还需要在Podfile中添加依赖的组件,以保证项目能编译通过。
end

2.7、前往github或gitlab等等平台创建项目EncryptionTools


2.8、把本地的代码提交到远程仓库

  • 在EncryptionTools工程根目录执行
git add .
git commit -m "提交说明"
git remote add origin 远程代码仓库地址
git push origin master 或(git push -u origin master)
git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)
git push --tags

上面git remote add origin https://gitee.com/CuteHf/HFMyTest.git可能出现问题:

fatal: not a git repository (or any of the parent directories): .git
表示在当前指向的文件夹里找不到库(.git文件夹)
解决办法是对目录进行初始化
git init

git push -u origin master

error: src refspec master does not match any.
error: failed to push some refs to 'git@github.com:Yxw9106/EncryptionTools.git'
出现错误的主要原因是github的README.md文件不在本地代码目录中,可以通过如下命令进行代码合并[注:pull=fetch+merge]
git pull --rebase origin master

三、对文件进行本地验证和远程验证(在工程目录下)

1、从本地验证你的pod能否通过验证

pod lib lint --use-libraries --allow-warnings

--verbose:有些非语法错误是不会给出错误原因的,这个时候可以使用--verbose来查看详细的验证过程来帮助定位错误。
--use-libraries:表示使用静态库或者是framework,这里主要是解决当我们依赖一些framework库后校验提示找不到库的时候用到。
--allow-warnings:表示允许警告。

2. 从本地和远程验证的pod能否通过验证

pod spec lint --use-libraries --allow-warnings

3. 将spec 文件提交到本地的私有仓库,然后再push到远程仓库

pod repo push SYPrivateSpecs SYIntelligentServicer.podspec --use-libraries --allow-warnings 

4.若依赖有其他私有库时,验证pod库或push时使用:

pod spec lint EncryptionTools.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/CocoaPods/Specs.git,https://git.XXXXXo/modulization-mobile/SYPrivateSpecs.git'

pod repo push SYPrivateSpecs SYIntelligentServicer.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/CocoaPods/Specs.git,https://git.xxxx/modulization-mobile/SYPrivateSpecs.git'

四、我们可以使用trunk来发布组件到cocoapod/master,trunk需要CocoaPods 0.33版本以上

1、查看是否注册trunk
pod trunk me
2、注册命令
pod trunk register xxxxxxx@qq.com "userName" --verbose
注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下
3、发布到cocopod/master,在有.podspec文件的组件工程根目录执行
pod trunk push EncryptionTools.podspec --allow-warnings 

**注:在使用cocoapods 上传自己的库时,执行命令:pod trunk push xxxx.podspec 命令报错:[!] Source code for your Pod was not accessible to CocoaPods Trunk. Is it a private repo or behind a username/password on http?
解决方案:将spec 文件中的 source 地址,使用 https 方式,不用使用 git 方式
**


4、发布完成之后搜索不到的问题解决办法
将组件在CocoaPods上面发布之后,使用pod search 组件名称却搜不到相关的信息,这个时候需要将cocoaPods的搜索缓存文件清理一下,然后重新使用pod search,就能得到最新的结果,

进入搜索CocoaPods缓存目录
cd ~/Library/Caches/CocoaPods

查看缓存文件search_index.json
ls

删除搜索缓存文件
rm -f search_index.json

注意:
1.私有库的子模块

如果你想引用一个私有库里面的一小部分功能,但是又不想把整个库导入,那么私有库的子模块正和你意
这里举例定义一个宏定义的子模块,里面是一些宏定义文件,外部可单独依赖这个子模块

#子模块的定义,也还是在.podspec文件中
  #子模块 —— 宏定义
  s.subspec 'Macro' do |submacro|
      submacro.source_files = 'YMCommonViewLib/Classes/Macro/*.{h,m}'
  end
  #使用子模块时只需在podfile中添加  pod 'YMCommonViewLib/Macro' 即可

2.使用私有库组件开发技巧

在实际项目开发过程中,因为有些私有库在推送到索引库时时间可能会有10-20分钟,频繁的提交到索引库并不现实,而且不适合做私有库版本控制,所以这边建议主工程可依赖私有库的分支,而不是索引库对应的tag版本,到最后项目上线或者私有库需要定个版本的时候再打tag提交到索引库。

//主工程podfile
  pod 'YMCommonViewLib',:git => 'http://****/ymcommonviewlib.git', :branch => 'branchName' #直接使用远程厂库的branchName最新提交,而不是通过ymspecrepo索引库中的tag标签
  //还有一种方式,直接使用本地的仓库
#  pod 'YMCommonViewLib',:path => '/Users/max/Project/YMCommonViewLib' #直接使用本地厂库, '/Users/max/Project/YMCommonViewLib' 是私有库在本地的目录,这种更方便于开发,在当前主工程项目里即可编译运行看到修改的效果。
如果想在私有库中添加像在PCH中导入的头文件,直接在Support Files下的prefix.pch中导入头文件,一旦在私有库工程中执行pod install操作,就会被重置,所以需要在.podspec文件中进行配置

3. pod私有库包含.a或.framework静态库的处理

//如果依赖有静态库,需要像以下方式添加依赖
s.vendored_libraries  = 'YMCommonViewLib/Classes/Lib/*.{a}'    //该目录下的.a静态库
  s.vendored_framework  = 'YMCommonViewLib/Classes/Framework/***.framework'  //Framework目录下的***.framework静态库
  s.static_framework = true  //指定pod加静态库标签

3.1包含静态库在做验证和推送到索引库时时也要添加拼接一些命令

pod repo push YMSpecRepo YMCommonViewLib.podspec --allow-warnings --skip-import-validation --use-libraries --verbose --sources='https://github.com/CocoaPods/Specs.git,https://git.xxxxxx/modulization-mobile/SYPrivateSpecs.git'

3.2如果依赖的第三方有自己的私有库,在校验的时候需要指定source,后面要添加你索引库的地址

pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://******/ymspecrepo.git --allow-warnings --verbose --skip-import-validation
依赖第三方库

s.frameworks:依赖系统的动态库 比如 UIKit
s.vendored_framework:依赖非系统的动态库 比如TencentOpenAPI.framework
s.libraries:依赖系统静态库 比如libstdc++.a
s.vendored_libraries:依赖非系统的静态库 比如新浪微博的libWeiboSDK.a
s.dependency:依赖pod库
s.source_files:依赖的头文件

s.source_files = ['SYOnly/include/*.h','SYUnify/Classes/**/*']
s.frameworks = "AudioToolbox", "AVFoundation", "CoreTelephony", "SystemConfiguration", "GLKit"
  s.vendored_libraries = "SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientLib/*.a"
s.vendored_libraries = [
    'SOnly/libUMSPosPayOnly.a',
    'SControl/libPaymentControl.a']
  s.libraries = "sqlite3.0", "c++", "iconv.2.4.0", "z.1.2.5"
  #s.resources = 'SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/**/*'
  s.resources = ["SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientEASRResources/*.dat", "SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientResources/Tone/*.caf","SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientResources/Theme/*.bundle","SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/TTS/*.dat"]
  s.requires_arc = true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容