https://guides.cocoapods.org官网
有些时候我们的项目太过于庞大,需要进行组建化开发,可以将每个模块开发成一个组件。或者是我们的一些自己库,想用pod导入,又不想使用本地路径的方式。这时候我们就可以做一个远程的私有代码仓库,这样我们开发的库就可以满足我们自己用pod进行导入,又不用让别人看到;
因为索引库中之存放框架的描述信息,真正的框架是存放在描述信息制定的地址之中,所有我们要想把自己的代码放到pods索引库中,我们首先应该是给自己的远程仓库的框架添加一个描述文件,将描述文件上传到远程框架的索引库当中,1开发框架->2添加spec文件->3上传spec到索引库
进入github索引cocoapods可以看到一个Cocoapods/spec文件
首先我们可以现在远程代码仓库创建一个新的仓库用来存放我们自己框架的源码;然后在我们电脑上面床架一个git仓库,然后将我们本地的git仓库和远程的代码仓库建立连接,可以使用clone也可以
手动连接git remote add origin 连接地址
;
使用 git remote
测试是否添加;
使用 git push origin master
将本地代码推送远程仓库;
使用终端cd
到git同级目录创建spec文件 pod spec create TestLib
,一般名称和代码的文件名一致;
创建好spec文件就可以修改里面的信息了:
里面有homepage
- spec.name = 'Reachability' 框架名
- spec.version = '3.1.0' 版本号
- spec.license = { :type => 'BSD' }
- spec.homepage = 'https://github.com/tonymillion/Reachability' 主页
- spec.authors = { 'Tony Million' => 'tonymillion@gmail.com' } 作者
- spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.' 描述
- spec.description = <<-DESC
- Computes the meaning of life.
- Features:
- 1. Is self aware
- ...
- 42. Likes candies.
- DESC 详细描述这个字数要比上面summary长并且不可以为空
- spec.source = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' } 远程仓库的地址,发布的本号,一般
- spec.source_files = 'Reachability.{h,m}'
- spec.framework = 'SystemConfiguration'
- spec.source_files = "Classes", "Classes/**/*.{h,m}" 需要添加到仓库的文件
- spec.exclude_files = "Classes/Exclude"
- spec.source_files = 'Reachability/common/*.swift' 需要下载的文件,放到项目里面的,这个路径是spec文件对应的相对路径,
接下里需要给git设置tag这里面的tag钥匙spec的tag保持一致,因为他检索的时候需要根据这个tag去远程仓库查找
添加taggit tag 0.1.1 -m'描述文字'
把tag推送到远程代码仓库git push --tags
这时候刷新远程代码仓库,就可以看到这个0.0.1的新版本了
接下来要把我们的spec上传到远程框架的索引库中了,首先注册一下trunk,这个trunk就是允许我们将自己本地的sdk上传到官方的spec索引库中pod trunk register 759542164@qq.com 'SLL' --description='苏'
验证完成之后 就可提交了pod trunk push TestLib.podspec
,直接提交可能因为警告不能成功。使用命令pod trunk push TestLib.podspec --allow-warnings
这里的文件名要注意别写错
提交成功之后,远程索引库会自动同步本地的索引库,如果提交成功本地还是索引不到,可能是本地索引没有更新
使用命令pod install --no-repo-update
下载不需要检查更新pod install --repo-update
检查本地更新
如果想搜索的话可以使用 pod search XXX
创建远程私有代码仓库,
只有我们自己可以使用将代码放到远程代码仓库,共自己项目组使用
- 在代码托管平台创建我们的代码仓库,因为GitHub上面私有的要钱,所以我们可以其他的比如码云,coding都可以,这里我使用的是coding ,先在网上创建好我们的代码仓库。复制url连接
原理:
创建远程代码仓库->生成spec文件->上传spec到代码仓库
生成我们自己的远程代码库,将我们远程代码仓库的spec上传到我们自己的私有的索引库,然后在本地生成我们的本地索引库。
我们自己的授权的用户可以使用
私有库的划分,主要骨架做成私有库而不是所有的文件都是一个库,根据不同功能和模块划分。
基础组件(分类)、功能组件、业务组件(骨架);业务组件依赖基础组件
创建组件库文件夹testLib->FMBases->Classes->文件
创建本地私有库FMBases->git init
-> git add.
-> git commit -m 初始化
添加podpod init
->pod install
创建podspec文件pod spec create FMBases
在描述文件里面写这个信息
将本地库集成到宿主项目里面pod init
->pod install
生成podfile文件配置库的信息
- target 'XMGFM' do
- frameworks
- use_frameworks!
- pod 'XMGFMBase', :path=>'../localLib/XMGFMBase'相对路径
- end
然后执行pod install
生成私有的索引库
在远程创建我们代码仓库XMGFMSpecs,复制仓库的url或者使用ssh公钥匙和私钥匙,私钥匙留着,公钥匙给外界
如何生成一个公钥
终端ssh-keygen
存放目录在 /Users/luosu/.ssh/id_rsa.pub
- 添加自己的本地索引库
pod repo add 库名 url
pod repo add 库名 ssh
可以在终端执行pod repo
查看当前存在的索引库
添加成功之后,我们就有了自己的索引库了。
将开发代码上传到远程仓库,这个需要新建一个仓库,不是刚刚的索引仓库
cd
到本地创建一个remoteLib文件夹
- 创建一个我们需要开发的组件,创建一个模版库
pod lib create XMGFMBase
- What platform do you want to use?? [ iOS / macOS ]
- > iOS
- What language do you want to use?? [ Swift / ObjC ]
- > ObjC
- 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?
- > XMG
然后终端就会执行一些基本让我选择的基本选项,执行完之后就创建了一个带有基础组件和demo案例的项目,用来测试的项目,这是后我们需要把我们的组件放到XMGFMBase/Classes/
然后 安装一下pod 文件 pod install
修改了podspec文件相关配置,因为别人下载是根据podspec里面的信息找远程代码仓库。主要是source等内容
然后回到XMGFMBase文件夹
使用pod lib lint
它自动检索当前文件夹下的spec文件,进行本地验证,他不会验证source里面的tag。但是如果远程验证pod spec lint
的话会发现没有tag会报错,因为他会去验证我们的代码仓库,这时候我们创建好的代码还没有提交到远程代码仓库呢,git init
->git add .
->git commit -m xxx
->git remote add origin https://gitee.com/stop_and_stop/xmgfmbase.git
->git push -u origin "master"
然后代码提交到远程代码仓库
这时候还有创建tag,远程验证依然不通过
添加tag,这里面的tag要跟.podspec里面的version保持一致git tag -a 0.1.0 -m '描述文字'
把tag推送到远程代码仓库git push --tags
一旦验证成功,就说明私有库索引没有问题,然后把索引文件传到自己的XMGFMBase私有索引库当中,pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings
这句会自动上传到远程私有索引库里面
然后我们再使用的时候需要在podFile文件里面添加私有库的sourcesource 'https://e.coding.net/shllearn/shlprivatestore/shlprivatestore.git'
这样设置之后可以加载自己远程私有库了,但是还不能加载共有的远程私有库,所以还要添加公共的索引库sourcesource 'https://cdn.cocoapods.org/'
Podfile文件具体配置
- source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
- source 'https://cdn.cocoapods.org/'
- use_frameworks!
- platform :ios, '9.0'
-
- target 'XMGFMBase_Example' do
- pod 'XMGFMBase'
- pod 'MJExtension'
- end
远程私有索引库的升级
cd到模版库文件,将需要增加的代码,copy到Classes文件,
修改podspec文件,
pod install
更改版本号,git add .
-> git commit -m xxx
->git push
添加taggit tag -a 0.2.0 -m xxx
->git push --tag
验证文件本地pod lib lint
远程pod spec lint
更新新本地索引库pod repo push XMGFMBase XMGFMBase.podspec --allow-warnings
如果出现奇怪的错误,可以把原来下载的pod 用命令 pod install
s清理一下
然后 Example里面pod install
一下,
不更新索引库 pod update --no-repo-update
更新框架不更新索引库
远程私有库依赖+升级
把需要使用第三方库的组件拖入Classes
执行pod install
example里面可以看到新的组件
如果自己的组件库中使用了第三方的库就需要添加依赖,
修改spec文件s.dependency 'AFNetworking'
s.dependency 'SDWebImage'
这样在下载私有库的库时候会检测哪些依赖的库,如果有就会把依赖库一起下载过来。pod install
编译一下看是否成功,成功之后提交远程代码仓库git add .
->git commit -m xxx
->git push
git tag 0.3.1
->git push --tags
验证sepc文件是合法pod spec lint
成功就提交到本地索引库pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
用另外的工程引入第三方可以使用就可以
远程仓库私分支
因为我们有时候字需要仓库的一部分组件的功能,所以要实现分支功能SubSpecs
修改podspec文件
- s.subspec 'Base自控名称' do |b别名|
- b.source_files = 'XMGFMBase/Classes/Base/**/*'
- end
将主库的s.source_files注释
如果有的库需要依赖第三方的框架,不能直接写在外面了,
- s.subspec 'Network自控名称' do |n|
- n.source_files = 'XMGFMBase/Classes/Network/**/*'
- n.denpendency = 'AFNetworking'
- end
修改完成测试没有错误以后,上传代码到远程仓库git add .
-> git commit -m xxxx
->git push
添加taggit tag 0.2.2
->git push --tags
验证spec文件是否符合格式pod spec lint --allow-warnings
上传到本地私有索引库pod repo push XMGFMSpecs XMGFMBase.podspec --allow-warnings
成功之后 使用pod search XMGFMBase
测试有没有
在宿主工程测试一下可以用了么
- source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
- source 'https://github.com/CocoaPods/Specs.git'
- platform :ios, '8.0'
-
- target 'XMGFM' do
- use_frameworks!
-
- pod 'XMGFMBase/Category'
- #pod 'XMGFMBase/Base'
- #pod 'XMGFMBase', :subspecs => ['Base', 'Category']
- #pod 'MJExtension'
- end
主骨架组件化
创建一个新的框架pod lib create XMGFMMain
- 填写框架的信息
- What platform do you want to use?? [ iOS / macOS ]
- > iOS
- What language do you want to use?? [ Swift / ObjC ]
- > ObjC
- 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?
- > XMG
这样创建的工程里面Example对框架是引用的关系,不是copy所以才可以边开发边调试
将main里面的Controller
,View
代码copy到当前框架XMGFMMain文件夹里面,Example pod install
就可以了
显build一下看是否需要依赖,如果需要记得修改podspec文件s.dependency 'XMGFMBase/Category'
然后因为加载的是私有库的框架,所以记得修改podfiles的source
- source 'git@gitee.com:stop_and_stop/xmgfmspecs.git'
- source 'https://github.com/CocoaPods/Specs.git'
然后pod install
加载组件库
到这步运行还是有错误,因为加载不了NIB等资源,因为使用加载这些资源使用时mainbundle来加载的,而现在资源不在mainBundle里面
查询当前的bundle路径
- NSBundle *currentBundle = [NSBundle bundleForClass:self];
- 当前类的路径
添加图片资源,应该放到组件内部
先把assert里面的图片拿出来,github上面cartool放入输入和输出路径来破解出来;放到开发组件Classes同级的asserts里面
修改podspec文件。描述
- s.resource_bundles = {
- 'XMGFMMain' => ['XMGFMMain/Assets/*']
- }
这样还不能直接使用,因为放到这个文件夹里面之后,最终打包成一个资源包。这个放到项目名.framework
里面
使用图片的时候xib里面用 项目名.framework/图片名
代码里面加载,不能直接使用imageNamed方法,要使用
- // 设置tabbar 背景图片
- // car, mainBundle
- NSBundle *currentBundle = [NSBundle bundleForClass:[self class]];
- NSString *imagePath = [currentBundle pathForResource:@"tabbar_bg@2x.png" ofType:nil inDirectory:@"XMGFMMain.bundle"];
- UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
- self.backgroundImage = image;
私有库资源依赖
有时候我们自己写的库需要依赖图片、xib、 storyboard等资源
我们最终要达到目的是 宿主工程里面只集成业务组件
然后在终端,执行一下
pod install
就把本地库引入了我们的项目,因为我们引入的时候没有选择,copy item if needed。所以项目中只是对文件的引用,我们这样就可以边开发边测试了,等开发功能差不多的时候,就可以进行下一步了。
在代码托管平台创建我们的托管项目
创建的时候注意,不要勾选,readeMe和gitignore,因为我们上一步创建出来的项目里面自带这两个文件。如果远程又创建了会产生冲突,
创建完之后,会有一个url用来cloning的
然后找到url更改我们本地代码的.podspec文件的里面一些配置
- #核心代码所在的位置
- s.source_files = 'HomeKit/Classes/**/*'
默认当前文件在哪里,他就是找到当前文件的目录下面,因为 HomeKit跟。podspec文件在同一级目录,所以不需要,跳转文件夹
/**他会找当前文件夹里面的所有文件,不写的话他只会查找一层
之后开发更新,版本号也是需要更改的。每次更新版本都需要更改,注意跟tag保持一致
s.version = '0.1.0'
因为Cocoapod是根据tag去索引代码的,git的tag。如果没有写的话是不能下载的,
创建好远程的代码库,然后将.podspec里面source改成创建好的远程地址
s.source = { :git => '创建好的远程代码托管url', :tag => s.version.to_s }
- 当我们的代码运行没有错误之后,我们就可以添加到远程代码仓库了
- 总体来讲的话,使用终端操作git管理代码有这么几个主要步骤
先查看文件的状态git status
- 把文件添加到本地暂缓区
git add .
- 把文件添加到本地代码仓库
git commit 文件名
- 建立本地仓库与远程代码仓库之间的连接
先查看是不是有远程的代码仓库git remote
如果没有的话手动添加关联git remote add origin 远程仓库url
- 把本地代码提交到远程代码仓库
git push origin master
- 添加tag,这里面的tag要跟.podspec里面的version保持一致
git tag -a 0.1.0 -m '描述文字'
- 把tag推送到远程代码仓库
git push --tags
- 将我们的组建添加到pod库里面,这里需要穿我们自己私有的库名还有组建的podspec文件全称
pod repo push HLPrivateStore HomeKit.podspec
执行这句可能会产生警告,这时候我们可以忽略警告,可以在后面加上 一句
pod repo push HLPrivateStore HomeKit.podspec --allow-warnings
当执行完这部我们用pod search
来搜索一下看看有没有我们的库,如果有就可以使用了。注意,要在podfile文件里面加上一句
source '本地库的url '
因为他默认会从公有库里寻找,
- 注意以后我们更新我们的库的话 需要更改podspec。里面的version
还要重新设置git的tag
划分子组件
如果我们的组件中用到了太了文件和一些共有的工具类,我们可以将它们划分成一个个子组件,这样当我们使用的时候,在工程里面就可以很清晰的辨别文件的类型
- s.subspec 'Frame' do |frame|
- #两个frame的名字不能一样不然会出错,第二个只是一个变量名字,用来在在这个区间使用
- frame.source_files = 'HomeKit/Classes/Frame/*.{h, m}'
- end
因为我们没有改代码,所有子需要重新覆盖一下本地的podspec文件就好了
pod repo push HLPrivateStore HomeKit.podspec --allow-warnings
因为我们刚刚更新了spec的文件,划分了文件结构,所以我们引用的项目,重新pod update
一下
这时候我们引用的地方可能会出现,划分的文件夹,但是里面没有文件,文件还是在外面,这是因为我们那有引用全部文件s.source_files = 'HomeKit/Classes/**/*'
这句代码,所以我们要把这句话注释掉,就可以了
组件加载资源文件(图片 xib storybord)
在 .podspec文件里面更改
- s.resource_bundles = {
- 'HLCategory' => ['HLCategory/Assets/*.png', 'HLCategory/Classes/**/*.xib']
- }
-
- s.resource_bundles = {
- 'SHLLiveKit' => ['SHLLiveKit/Classes/**/*.{storyboard,xib}']
- }
当我们在使用 我们框架里面的图片资源的时候,要记得加上bundle的名字,因为Xcode会将我们的资源压缩到我们框架的bundle里面,它本身不是mainBundle里面的资源,所以不能直接使用,图片名字