美文网首页iOS 艾欧艾斯iOS知识总结
创建自己的本地私有pod(实践)

创建自己的本地私有pod(实践)

作者: ivanStronger | 来源:发表于2016-06-04 13:23 被阅读5164次

创建自己的本地私有pod(实践)

下面描述到的操作,我全部都一一实践过,可以保证是没有问题的。如果有读者已经完成了部分操作,可以根据需要选择步骤阅读或者查看“遇到的问题”栏。写了好长时间,如果对你有帮助,还望给点个赞,非要捐助的我也没意见~~~

为什么要这么干

开发过程中我们会有许多公用的组件,比如多个工程会同时引用一段代码。记得多年之前,我曾经打过静态包,还制作过framework来满足我的需求,但是都太不方便了。尤其是多人合作开发的时候,弊端很大。把公用库交给cocoapods来管理,是我觉得目前最方便的解决方案了。伙伴们只要简单几句命令行就可以完成库的安装和更新,真乃团队协作利器。

操作过程中如果遇到命令不明的情况,建议多去官网搜索,里面提供的内容都是最全最准的。Command-line Reference

准备工作

1、准备一个git远程仓库,存放我们自己的specs。

specs可以理解为我们查找库时候的一个索引,为什么我们执行pod search AFNetworking命令时,返回结果如此之快。因为安装cocospod的时候,本地目录就已经有了一份master(公开)的specs,全球程序员们提交到cocospod的开源代码在这都有记录。
我们可以通过执行命令1查看下目录结构,结果一目了然。

命令1

open ~/.cocoapods/repos/master

2、一个git远程仓库,存放我们自己的公共组件代码。

其实这个也可以是别的(比如svn),不过我只尝试过git。git远程仓库我用的是偏爱的coding,免费、好使。

创建私有Spec

准备工作的第一步已经完成了,我创建的私有specs仓库地址为https://coding.net/zanyfly/ZYSpecs.git。下面执行命令2把Spec创建到本地。

命令2

pod repo add ZYSpecs https://coding.net/zanyfly/ZYSpecs.git

这时候ZYSpecs就在本地目录下创建成功了,通过命令查看ZYSpecs的目录结构,会发现里面的内容和git仓库上的保持一致。

open ~/.cocoapods/repos/ZYSpecs

创建个人pod

这一步的主要目的是为我们的公用代码创建podspec文件,这个文件会要求我们配置很多必要的信息。如果你的公用库代码已经是一套成型的组织,那么可以考虑直接新建一个podspec。我的做法是利用命令3创建一个完整的pod,也就是从头开始,好处是可以选择生成Example工程和测试框架,方便调试以及帮助他人学习使用。

1、创建podspec

命令3

pod lib create ZYLib

过程中终端会向我们提出一系列问题,包括开发语言是OC还是Swift(Objective-C or Swift
),demo程序(Making a Demo Application),是否包含测试框架(Choosing a Test Framework),界面测试等(View-based Testing)。选项问题都很简单,我选择了包含demo程序,没有测试框架,大家可以根据自己的实际需要进行选择。</br>
2、编辑podspec
操作成功后,可以看到ZYLIB.podspec文件就已经创建好了,而且其中包含一个Example目录。大体的结构图(摘自官网)

$ tree ZYLIB -L 2

  ZYLIB
  ├── _Pods.xcproject
  ├── Example
  │   ├── ZYLIB
  │   ├── ZYLIB.xcodeproj
  │   ├── ZYLIB.xcworkspace
  │   ├── Podfile
  │   ├── Podfile.lock
  │   ├── Pods
  │   └── Tests
  ├── LICENSE
  ├── ZYLIB.podspec
  ├── Pod
  │   ├── Assets
  │   └── Classes
  │     └── RemoveMe.[Objective-C/m]
  └── README.md

用编辑器打开podspec,把里面的资料都填写一下,下面是我写的(#注释的部分都被我删掉了)。特别指出:务必保证填写的每一项都要是正确的,比如主页和链接都要能够访问。

Pod::Spec.new do |s|
  s.name             = 'ZY_LIB'
  s.version          = '0.1.0'
  s.summary          = 'This is my pod lib'


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

  s.homepage         = 'https://git.coding.net/ivanzeng/ZY_LIB.git'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'zengyuan' => 'zanyfly@126.com' }
  s.source           = { :git => 'https://git.coding.net/ivanzeng/ZY_LIB.git', :tag => s.version.to_s }
  s.social_media_url = 'http://www.jianshu.com/users/f8e79006b5c6/latest_articles'

  s.ios.deployment_target = '7.0'

  s.source_files = 'ZY_LIB/Classes/**/*'

  s.public_header_files = 'ZY_LIB/Classes/**/*.h'
  s.dependency 'AFNetworking', '~> 2.0'
end

提示: s.public_header_files是要公开的头文件,s.dependency表示依赖库,我的库HTTP通信部分用了AFNetworking,没有的话可以直接注释掉。</br>
3、测试podspec
我首先是打开Example,在工程里直接尝试调用库文件,保证编译过程中没有错误,没有警告,运行过程中可以正常使用。
最后打开命令行,cd到podspec所在的当前目录,执行命令4进行检验。

命令4

pod lib lint

幸运的话,我们可以看到passed validation.的提示。如果提示验证失败,不要着急,仔细阅读它描述的错误信息,基本上google一下就能找出解决方案。</br>
备注:要是实在是解决不了警告也没关系,在后面追加 --allow-warnings

4、提交ZY_LIB代码
这时候ZY_LIB验证通过,确定没问题了,那么把代码push到我们公用库远程仓库上去,否则其他的同事或者合作者就没法用了。基本操作就是add、commit、push,最后重点说明一个事情,push结束以后千万不能忘记打tag!!!而且tag值一定要和s.version保持一致!!!

$ git tag -m "ZYLib say hi to you" 0.1.0
$ git push --tags  

这些操作全都结束以后,可以通过log日志的方式,来确保我们没有遗漏操作。</br>
5、push podspec
执行命令5,这时候本地的repos目录就有ZYSPECS了,和~/.cocoapods下的master是同级。
命令5

pod repo push ZYSPECS ZYLIB.podspec。

提交时候,会再进行一次验证,如果遇到警告不通过的问题,可以考虑 pod repo push ZYSPECS ZYLIB.podspec --allow-warnings
</br>
6、搜索公用库,执行命令6
命令6

pod search ZYLib

查询到结果,说明已经安装成功。

使用公用库

使用方式和其他的开源库一样,修改podfile,增加库标记。不同的是,需要在头部增加

source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/ivanzeng/ZYSpecs.git'

否则可能会出现无法正确安装的情况。其他同事或者小伙伴,在自己的电脑执行一下命名进行安装,

pod repo add ZYSpecs https://git.coding.net/ivanzeng/ZYSpecs.git

如果是更新就换成 repo update。

写作参考

遇到的问题

1.demo下无法import到库头文件
解决办法:我遇到过一次,如果发生了,手动打开pod工程 - Build Phases - Headers - Public,把我们需要的头文件加进去。

2.pod lib lint执行报错
记得修改下summary,别用初始的。看看source和homepage是否正确,public_header_files是否正确引用。还要记住代码文件不能有警告,有警告也无法编译成功。

3、 pod lib lint执行报错

  - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. You can use `--verbose` for more information.
    - ERROR | xcodebuild:  ....
    -  error: include of non-modular header inside framework module '' [-Werror,-Wnon-modular-include-in-framework-module]
...

原因就是我的库的某个头文件中直接import了第三方库(我对它有依赖)的头文件,我采用了前向声明的方式解决。

4、pod lib lint验证成功了,但是在接下来的pod repo push报错
而且报的是就是podspec无法通过验证,解决方法,重新提交一个tag并push。在执行pod repo push,验证通过。

5、pod search可以成功的搜索到我们的库,但是在项目中执行pod install报错
Unable to find a specification for **

在podfile 文件中

source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/ivanzeng/ZYSpecs.git'

6、在pod中引入第三方库报错
比如在自己的pod中引入sharesdk,lint时报错

The 'Pods-Your Example' target has transitive dependencies that include static binaries:

这是因为sharesdk以framework形式出现,导致lint在执行的时候因为静态库无法通过验证。可以在lint命令后面增加

--use-libraries

参考
https://www.jianshu.com/p/d6a592d6fced

相关文章

网友评论

  • LD_左岸:原因就是我的库的某个头文件中直接import了第三方库(我对它有依赖)的头文件,我采用了前向声明的方式解决。
    解决不了啊
    //#import "MBProgressHUD.h"
    @class MBProgressHUD;
    @interface MBProgressHUD (MJ)
    + (MBProgressHUD *)showMessage:(NSString *)message;

    报错:Cannot define category for undefined class 'MBProgressHUD'
    根本不让我前置声明.....
    LD_左岸:@ivanStronger -> LDBase (0.3.0)
    - WARN | url: The URL (https://gitee.com/buliceli/LDBase.git) is not reachable.
    - ERROR | [LDBase/Category] xcodebuild: Returned an unsuccessful exit code.
    - NOTE | xcodebuild: libpng warning: Warning: Input PNG does not have an 8 bit input depth. Please convert your PNG to 8-bit for optimal performance on iPhone OS.
    - WARN | [LDBase/Category] xcodebuild: LDBase/LDBase/Classes/Category/MBProgressHUD+MJ.m:20:53: warning: incompatible pointer types sending 'NSString *' to parameter of type 'Class _Nonnull' [-Wincompatible-pointer-types]
    - NOTE | [LDBase/Category] xcodebuild: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.2.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSBundle.h:40:37: note: passing argument to parameter 'aClass' here
    - WARN | [LDBase/Category] xcodebuild: LDBase/LDBase/Classes/Category/MBProgressHUD+MJ.m:61:9: warning: 'dimBackground' is deprecated: Customize HUD background properties instead. [-Wdeprecated-declarations]
    - NOTE | [LDBase/Category] xcodebuild: MBProgressHUD/MBProgressHUD.h:437:65: note: 'dimBackground' has been explicitly marked deprecated here
    LD_左岸:@ivanStronger 校验spec时报的错吗
    ivanStronger:报错粘贴下 @左岸__
  • S型身材的猪:拜托,你的前向声明是什么意思?重要的信息你一笔带过?解释不来就别发简书
    ivanStronger:@S型身材的猪 Forward declarations 属c++ 、oc基本语法的,我在其他评论里已经说明了。我还要给你专门解释?我写文章是为了专注分享,你不喜欢请右上角关闭
    Mr_Zander:我也遇到了你的这个问题,我把前面的那个warn解决以后后面的error都没有了。就是加上一个.swiftxxx 的那个warn。你可以试试,有问题可以联系我shizhiang@126.com
  • 09672784834b:补充:
    前向声明方式就是把 在.h文件import导入的第三方库,通过 @class 在.h中声明, 在.m中import导入
  • Civel_Xu: 发布成功之后, 项目中pod使用出现 Apple Match-O Linker error ,需要自己到target引用才能解决, 为什么 pod 没有被编译 , 是配置的时候需要注意什么吗
  • 柠檬草YF:这两个Git 有什么区别呢,请教
    https://coding.net/zanyfly/ZYSpecs.git
    https://git.coding.net/ivanzeng/ZY_LIB.git
    ivanStronger:@柠檬草YF yeah
    柠檬草YF:@ivanStronger 所以需要两个git仓库是吧
    ivanStronger:@柠檬草YF 一个是你的库,一个是版本索引。
  • 简简728:你好 如果要依赖自身模块 .podspec应该怎么写
  • fcb856a4cf0e:你好,请问你的向前声明是啥意思?:anguished:
    7b1f338f0c62:哥们有没有解决了
  • 七夜叹:你好,我的执行pod lib create xxx这个命令的时候,没有系统的问题,直接生成目录文件,是因为版本问题吗
    七夜叹:@丶karl丶 坡道版本低了,你升级下就好了
    ChoiKarl:我也跟你一样,pod lib create以后没有让我输入任何东西,直接生成了一些文件,请问你解决这个问题了吗?
  • maybenai:你这个向前声明怎么弄的?
  • f0c9cebb7743: pod lib lint执行报错 ------前向声明方式解决

    可否明确下,这里有些不懂
    7b1f338f0c62:这里表情也看不懂。有搞定了吗大兄弟
  • 遥遥领先M:- ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for `TRZXNetwork` depended upon by `TRZXConfirmFinancing`) during validation.

    楼主哈 遇到过这样的问题没?知不知如何解决 这个搞了很久不知道是什么原因
  • nzbypl:你好请教个问题,报错Returned an unsuccessful exit code,我这个是我引用了头文件,头文件是我直接拖进去的一个文件夹里面的文件,这个要怎么添加
    ivanStronger:我在上面有写到这个错误。你看下是不是前向声明的问题
  • a90a147abe6d:" - error: include of non-modular header inside framework module '' [-Werror,-Wnon-modular-include-in-framework-module]
    "
    我升级了cocoapods之后,也遇到这个问题,我想问你是怎么解决的?什么叫向前声明?
    ivanStronger:@LZZZ 最近一直没上,枚举的我没试过,但是应该也是可以有办法绕过去的~~~~
    LZZZ:@ivanStronger 请教下枚举没法前向声明,怎么办呢
    ivanStronger:@摩西摩西和辛巴 前向声明 @class YourClass,属于编程基础,可以自行搜索下~
  • 34df2971538e:学习了 :smile:

本文标题:创建自己的本地私有pod(实践)

本文链接:https://www.haomeiwen.com/subject/xvpldttx.html