美文网首页
cocoapods组件化-创建你的公有库/私有库

cocoapods组件化-创建你的公有库/私有库

作者: NULLGIRL | 来源:发表于2020-03-30 16:56 被阅读0次

    为什么要用?

    1.合作方便:项目越来越大,开发人员越来越多,功能点互不干扰的情况,要加载整个项目运行起来是耗时的,比如天猫淘宝支付宝。组件化就是把功能模块拆分,你只要负责自己实现的部分做成库就好,有需要的人就可以拉取加载。就算你更新了某些功能,其他使用者只要pod update xxxx(你的库)就好了不要太方便。
    2.自己方便:可以把常用的功能封起来,供自己的其他项目使用。

    是什么?

    CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It has over 71 thousand libraries and is used in over 3 million apps. CocoaPods can help you scale your projects elegantly.

    译:
    CocoaPods是Swift和Objective-C Cocoa项目的依赖管理器。它拥有超过71000个库,被300多万个应用程序使用。CocoaPods可以帮助你优雅地扩展你的项目。

    文件解释:
    1. \color{#ea4335}{podspec:} Pod描述文件,一般来说表征你的项目地址,项目使用的平台和版本等信息
    2. \color{#ea4335}{Podfile:} 用户编写的对于期望加载的pod以及对应Target信息
    3. \color{#ea4335}{Podfile.lock:} 记录了之前pod加载时的一些信息,包括版本、依赖、CocoaPods版本等
    4. \color{#ea4335}{Mainfest.lock:} 记录了本地pod的基本信息,实际上是Podfile.lock的拷贝。大部分开发者最熟悉的cocoaPods指令就是pod install,那具体在执行pod install时发生了什么呢?
      • 分析Dependency。对比本地pod的version和podfile.lock中的pod version,如果不一致会提示存在风险。对了,cocoapods可以多版本存在,只要在pod _x.x.x_ install就能指定版本初始化。
      • 对比podfile是否发生了变化。 如果发生变化,会生成两个列表,一个是需要Add的Pod(s),一个是需要Remove的Pod(s)。
      • 添加需要的Pod(s)。如果是常规的基于GiCocoaPods库,则:
        a. Spec下查找对应的Pod文件夹
        b. 找到对应的tag
        c. 定位其Podspec文件
        d. copy到Pod文件夹中
        e. 运行pre-Install hook
      • 生成Pod Project
        a. 将该Pod中对应文件添加到工程中
        b. 添加对应的framework、.a库、bundle等
        c. 链接头文件(link headers),生成Target
        d. 运行 post-install hook
      • 生成podfile.lock。生成此文件副本manifest.lock,放到Pod文件夹内。The sandbox is not sync with the podfile.lock 这种错误,则表示manifest.lock和podfile.lock文件不一致),此时一般需要重新运行pod install命令。
      • 配置原有的project文件(add build phase)
        a. 添加了 Embed Pods Frameworks
        b. 添加了 Copy Pod Resources

    pre-install hookpost-install hook可以理解成回调函数,是在podfile里对于install之前或者之后(生成工程但是还没写入磁盘)可以执行的逻辑,逻辑为:

    pre_install do |installer| 
        # 做一些安装之前的hook
    end
    
    post_install do |installer| 
        # 做一些安装之后的hook
    end
    

    再具体的就不说了,大家去看看这个大佬写的文章,我的文章也摘了一些他写的部分,非常的好和详细,推荐给你们:
    《基于CocoaPods的组件化原理及私有库实践》

    怎么做?

    此处以ZYUIToolsPod为例。

    1. 通过CocoPods的官方命令来进行Pod项目的创建,

    pod lib create HelloXXXPod

    1.What platform do you want to use? [ iOS / macOS ]
    应用在哪个平台上,一般我们选iOS
    
    2.What language do you want to use? [ Swift / ObjC ]
    使用何种语言,可以根据项目是OC还是Swift自行选择
    
    3.Would you like to include a demo application with your library? [ Yes / No ]
    问是否需要一个Demo工程,方便调试Pod。
    
    
    2. ZYUIToolsPod.podspec
    Pod::Spec.new do |s|
      s.name             = 'ZYUIToolsPod'
      s.version          = '0.2.0'
      s.summary          = 'Some UI Methods'
      s.description      = <<-DESC
    Some encapsulated UI extension methods, and the usual String methods。
                           DESC
    
      s.homepage         = 'https://github.com/NULLGIRL/ZYUIToolsPod'
      s.license          = { :type => 'MIT', :file => 'LICENSE' }
      s.author           = { 'NULLGIRL' => '422453403@qq.com' }
      s.source           = { :git => 'https://github.com/NULLGIRL/ZYUIToolsPod.git', :tag => s.version.to_s }
      s.ios.deployment_target = '10.0'
    
      s.source_files = 'ZYUIToolsPod/Classes/**/*.swift'
      s.swift_version = '4.2'
    
      s.frameworks = 'UIKit', 'CoreText', 'Foundation'
      s.dependency 'SVProgressHUD','2.2.5'
    end
    
    

    重点的几个:

    s.name : 库名
    s.version : 版本号,每次更新的时候需要更改
    s.homepage : 主页路径
    s.source : 仓库地址
    s.source_files : 文件(如果不放在Classes下,记得要改)
    s.swift_version : swift 版本号, 本来没写这行出错了
    s.frameworks : 依赖的苹果库
    s.dependency : 依赖的第三方库

    3. 本地调试:

    把需要用到的库文件,拉到ZYUIToolsPod/ZYUIToolsPod/Classes下。

    如果是通过pod lib create命令创建的Pod,会在Example中自动配置好该pod的本地调试脚本,如下:

    use_frameworks!
    
    target 'ZYUIToolsPod_Example' do
      pod 'ZYUIToolsPod', :path => '../'
    
      target 'ZYUIToolsPod_Tests' do
        inherit! :search_paths
      end
    end
    

    pod 'ZYUIToolsPod' :path => '../' ,在上层目录来下载ZYUIToolsPod这个pod。这是本地调试Pod的一种。

    来到ZYUIToolsPod/Example/ 路径下 执行:pod install后打开工程,这时候你的文件就被加载啦。

    库文件 库使用

    注意: swift的class权限用用public修饰。

    以上没问题后,本地验证:

    pod lib lint ZYUIToolsPod.podspec
    
    4. 上传到github上

    在github上创建一个仓库,https://github.com/NULLGIRL/ZYUIToolsPod.git

    来到项目的根目录:

    git add .
    git commit -m "Init"
    git remote add origin xxxxxxx  //(替换为自己的实际git地址)
    git push --set-upstream origin master
    

    \color{red}{注意:}podSpec文件需要版本控制信息,所以我们要打一个Tag.

    git tag -m  "v0.1.0"  0.1.0
    
    git push --tags
    
    5. 向Spec Repo提交podspec

    引用cocoapods官网:

    pod trunk push [NAME.podspec] will deploy your Podspec to Trunk and make it publicly available. You can also deploy Podspecs to your own private specs repo with pod repo push REPO [NAME.podspec].

    验证库:

     pod spec lint [NAME.podspec]
    

    如果你只是做一个私有库:

     pod repo push ZYUIToolsPod ZYUIToolsPod.podspec --allow-warnings
    

    如果你要做一个公有库,用pod trunk

    pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air' 
    # 先注册 , 会给邮箱发一封邮件,点击链接激活
    
      //查看有没有注册,有的话就是相关的注册账号的信息
    pod trunk me
    
    pod trunk push  [NAME.podspec]
    
    pod trunk add-owner ARAnalytics kyle@cocoapods.org
     #添加其他管理者
    

    成功:


    成功上传
    6.查查看

    pod search ZYUIToolsPod


    搜索结果
    7.更新版本
     #`s.version`    : 版本号,每次更新的时候需要更改
    s.verion = 0.2.0
    git add .
    git commit -m "更新"
    git push 
    git tag -m  "v0.2.0"  0.2.0
    git push --tags
    pod trunk push  [NAME.podspec]
    
    8.使用

    在podfile文件内记得加上source源地址(私有库的使用需要)

    source 'https://github.com/CocoaPods/Specs.git'
    source 'https://xxxxxxxx'
    
    platform :ios, "9.3"
    inhibit_all_warnings!
    
    target "NinthWallet" do
      use_frameworks!
      
      pod 'ZYUIToolsPod'
    end
    
    

    问题集锦

    1. Unable to find a pod with name, author, summary, or description matching
      首先去https://cocoapods.org 首页查找是否有你的库,
      如果没有就真是没有,如果可以搜索的话,说明这个库是成功上传的。因为pod的缓存问题,把缓存的索引文件删除。
     rm ~/Library/Caches/CocoaPods/search_index.json
    
    pod search ZYUIToolsPod
    

    2.An unexpected version directory 'Classes' was encountered for the
    来到~/.cocoapods/repos/目录下,把你的库文件ZYUIToolsPod给删除了,这是在example例子里,被拷贝进来的。可能会和search_index里的冲突了(我猜的,有知情的人可以讲讲)。之后

    rm ~/Library/Caches/CocoaPods/search_index.json
    
    pod search ZYUIToolsPod
    
    1. pod trunk push成功,也给出了链接路径,但是在cocoapods官网就是search不到。
      比如我之前,https://cocoapods.org/pods/ZYUIToolsPod ,明明已经存在,但是在https://cocoapods.org搜不到,百思不得其解,所有的步骤都跟官网的一样。后来才发现,是因为我在pod trunk regeist这一步,官网给我发了个邮件,我点击链接,但是当时失效了,我没有在意,毕竟失效了我的库还是传上去了,(没想到变成了一个“野库”)。
      屏幕快照 2020-03-27 下午2.59.14.png

    后来我又pod trunk regiest了一遍,又给我发了一新的邮件,我点击,这回激活成功了,我的库也能搜索到了。


    屏幕快照 2020-03-27 下午2.59.22.png
    1. Unable to find the 'specs' repo. If it has not yet been cloned, add it via 'pod repo add'.
      解决方法:
    pod repo add [库名称] [库地址]
    #eg :  pod repo add ZYUIToolsPod https://github.com/NULLGIRL/ZYUIToolsPod.git
    
    闲人庄大姐

    我干了,你随意🍺🍺🍺

    相关文章

      网友评论

          本文标题:cocoapods组件化-创建你的公有库/私有库

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