美文网首页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