搭建cocoapods仓库

1,533 阅读6分钟

前言

cocoapods仓库在ios开发中使用三方工具是必备的工具,可以使得一些开源框架能够与我们的项目很好的分开

多人开发、组件化开发、优化项目结构、分享优秀的框架等过程,或者方便分配工作等,有时会用到cocoapods仓库来编写某个项目模块,此时就涉及到了cocoapods仓库的搭建

搭建cocoapods案例项目的源码地址 ---- LSComponentDemo

cocoapods仓库的搭建

进入到响应的目录下,使用下面命令,即可创建pods仓库,其为https的方式下载模板模块

pod lib create LSComponentDemo

如果https模式下载模板失败的话,可以通过指定ssh模式下载模板,来创建pods仓库

pod lib create LSComponentDemo --template-url=git@github.com:CocoaPods/pod-template.git

下载完成仓库后,系统会提示输入邮箱地址,可以写上自己的邮箱地址

紧接着会弹出下面的选择,可以选择开发平台、语言等

Press return to continue.

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 ]
 > Yes

What is your class prefix?
 > LS

注意:这一步执行后,系统会自动在Example目录下执行pod install指令,如果失败的话可以取消,进入到该目录下,将podfile中导入的默认库删了即可

创建完毕后,其目录如下图所示

image.png

我们的工作笔录实际就在这个与 Example目录 同级的 LSComponentDemo(自己的仓库名字)下开发了

即:将ReplaceMe文件删了,换上自己的即可

我们可以打开Example中的案例项目,可以在里面进行开发测试等工作,其目录如下所示

image.png

可以看到有默认的几个目录

Example for LSComponentDemo 进行组件测试的目录

Podspec Metadata 为设置pods必要信息的目录,可以在里面设置readmepodspec相关配置

如下图所示,我们可以在里面配置相关信息

image.png

此外,为了组件开发和测试方便,我们可以在案例Demo中,导入 与我们组件相关的项目目录(即:前面提到到自己的仓库名字目录),添加进来,就可以在这里面创建文件进行开发和编译了

如下图所示,已经添加进入目录了

image.png

podspec的配置

podspec的配置,关系到文件导入,版本更新,依赖等信息,下面介绍下

Pod::Spec.new do |s|
  s.name             = 'LSComponentDemo'  //仓库为我们默认的名字
  s.version          = '0.1.0' //仓库版本号,每次更新内容时,需要更新版本号
  s.summary          = 'A short description of LSComponentDemo.' //描述信息


  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  //主页地址,https的pod仓库地址,后面介绍怎么传
  s.homepage         = 'https://github.com/Marshal-S/LSComponentPodsDemo.git'
  //截图地址
  # s.screenshots     = 'www.example.com/screenshots_1',  'www.example.com/screenshots_2'
  //作者等信息
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'Marshal-S' => '921871381@qq.com' }
  //pod仓库的源地址,可以设置https,也可以设置ssh
  s.source           = { :git => 'git@github.com:Marshal-S/LSComponentPodsDemo.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '9.0' //支持的环境版本

  //导入的源文件,注意默认是下面的*,全部导入
  # s.source_files = 'LSComponentDemo/Classes/**/*'
  //如果导入了bundles则导入文件类型时,需要标注,避免图片资源重复导入,报错问题
  s.source_files = 'LSComponentDemo/Classes/**/*.{h,m}'
  
  //导入此资源时,上面的source_files注意类型控制,后续版本不知道还会不会有问题,注意点总是好的
  s.resource_bundles = {
    'LSComponentDemo' => ['LSComponentDemo/Assets/*']
  }
  
  //设置公共头文件
  # s.public_header_files = 'Pod/Classes/**/*.h'
  //设置依赖库,可以设置多个,不导入的话,以pods方式导入可能会报错
  # s.frameworks = 'UIKit', 'MapKit'
  //设置pods依赖仓库,需要一个一个设置
  # s.dependency 'AFNetworking'
  # s.dependency 'Masonry'
end

设置podfie文件

use_frameworks!

platform :ios, '9.0'

target 'LSComponentDemo_Example' do

 //测试环境下 如果知道自己的目录位置,可以通过path的方式从本地导入 ../则是返回到上级目录查找 ./在本级目录查找
 # pod 'LSComponentDemo', :path => '../'
 
 //这是我们传入到github之后,可以直接从github上面下载更新
 pod 'LSComponentDemo', :git =>"git@github.com:Marshal-S/LSComponentPodsDemo.git"

end

添加组件文件

如下所示我们创建文件到对应的目录下(创建仓库的子目录的同名目录下),在 Classes 中创建我们的文件,这里创建的测试文件(资源文件可以放到Assets中),如下所示:

注意:前面我们添加了该目录到项目中,因此创建的文件会自动放到对应目录下

image.png

上传的到git仓库(github或者自己公司的gitlab等)

git add .

git commit -m '提交内容'

git remote add origin 仓库地址

git push origin master

git tag 0.1.0  //这个和我们在 podspec 中设置的一样 version 版本号一样

git push origin 0.1.0 //提交 tag号即可

这样就上传的指定git仓库了

紧接着就可以更改podfile文件指定到我们的仓库地址了

pod 'LSComponentDemo', :git =>"git@github.com:Marshal-S/LSComponentPodsDemo.git"

然后指定 pod install 即可

如果需要更新最新版本,使用 pod update 即可

更新pod仓库版本

当我们编写完成之后,后续需要维护和更新,那么我们更新版本需要更改下面几步

podspec中更新版本号,此外可以根据自己需要更新其他选项

使用 git 添加新的 tag 标签


git add .

git commit -m '提交内容'

git push origin master

git tag 0.1.1  //这个和我们在 podspec 中设置的一样 version 版本号一样

git push origin 0.1.1 //提交 tag号即可

如下图所示,新项目直接 pod install 即可

image.png

如果已经有低版本,执行 pod update 即可

image.png

接下来就可以在 案例中测试代码了,如下所示

image.png

更新到 cocoapods trunk中

步骤如下所示:

注册trunk账号为github绑定的邮箱,会收到一封带有链接的邮件,打开链接完成注册

pod trunk register 自己github绑定的邮箱 'mxObject-c' --description='register trunk,描述内容'

然后将仓库推送到cocoapods trunk 上

pod trunk push LSComponentDemo.podspec --allow-warnings

成功后,podfile中就可以直接使用我们的仓库名字了,不用在后面添加地址名字了

pod 'LSComponentDemo'

图片资源加载方案

项目中已经新增了图片加载方案示例代码,在testView

如下所示,新增了三种类型的图片(编写的时候,图片等资源都放到 Assets 文件夹中即可, pod 导入后会自动放到 Resources 文件夹中)

一种是常访问的小图片,一般放到 Assets.xcassets中,一般以缓存方式加载 imageNamed

一种是直接放图片临时使用的或者大图片,一般直接以非缓存方式加载 imageWithContentsOfFile

一种是放到 .bundle 中,方便隔离其他资源文件,使用方式同前两种,只是多了一层寻找bundle的过程

image.png

另外新增过程不要忘了将 podspec 中的 bundle加载注释解封

 s.resource_bundles = {
    'LSComponentDemo' => ['LSComponentDemo/Assets/*']
 }

其加载方案如下所示

//获取组件生成的framework中所在的bundle中(和 mainbundle类似)
NSBundle *bundle = [NSBundle bundleForClass:[self class]];

//直接从该framework组件中,以缓存方式加载图片
UIImage *image = [UIImage imageNamed:@"icon_star" inBundle:bundle withConfiguration:nil];

//直接从该framework组件中,非缓存方式加载图片
UIImage *image2 = [UIImage imageWithContentsOfFile:[bundle pathForResource:@"icon_star1" 
    ofType:@"png"]];
        
//调用组件内创建的.bundle类型的内部图片资源,需要进一步获取 .bundle 的bundle
//此时的 bundle 和 前面获取到的 bundle 类似,里面也可以放置必要的资源文件
NSBundle *assetBundle = [NSBundle bundleWithPath:[bundle pathForResource:@"Component1" 
    ofType:@"bundle"]];

//从组件创建的.bundle中调用图片
UIImage *image3 = [UIImage imageNamed:@"icon_star2" 
    inBundle:assetBundle withConfiguration:nil];

注意: 上方的的 bundle 可以使用 static 的方式或者单例方式保存,下次直接使用找到的 bundle 直接访问图片等资源即可

最后

cocoapods仓库的搭建就介绍到这里了,cocoapods部分参考内容 这里