美文网首页
cocoaPods私有库创建以及使用,多重库引用

cocoaPods私有库创建以及使用,多重库引用

作者: 黄易女民工jiang | 来源:发表于2020-02-04 10:07 被阅读0次

    一、创建本地pod私有库


    1.创建git私有库

    在进行一切操作之前,先在内网创建一个git仓库。
    这块我就不多做介绍啦,建库都会滴 ~~
    https://xxxxxx/xxxx/iOSComponents/XXXXBaseIoTSocketManager.git

    2.在本地创建工程

    cd到你想要创建pod库工程的路径下,并执行pod库创建:

    pod lib create XXX(库名)
    

    如图1所示:


    图1

    回车,回答一下问题:

    #选择使用平台
    What platform do you want to use?? [ iOS / macOS ]
     > iOS
    
    #选择你想使用的变成语言
    What language do you want to use?? [ Swift / ObjC ]
     > ObjC
    
    #是否创建一个demo工程,为了方便测试,选择Yes
    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
    
    #demo工程的class前缀
    What is your class prefix?
     > XXX
    

    然后会弹出一个名为XXXBaseIotSocketManager-Example的工程,目录如图2所示:


    图2
    cd 到 Example 文件夹下, 安装CocoaPods项目
    pod install --no-repo-update
    进入Example文件夹点击.xcworkspace的文件夹打开项目,运行一下是否成功
    

    如图3所示:


    图3

    二、编辑私有库


    1.添加代码文件 & 资源文件 (复制粘贴)

    如图4所示,XXXBaseIoTSocketManager目录下有两个文件夹,一个Assets,一个Classes文件夹,用来添加资源文件和代码文件。
    把代码加进了Classes文件夹中,如下图4:

    图4

    加进来应该后,工程应该如图5所示:


    图5

    如果工程目录中pod中,没有该索引的话,就自己加一下,如图6所示,如


    图6
    2.编辑.podspec配置文件
    #
    # Be sure to run `pod lib lint BOEBaseIoTSocketManager.podspec' to ensure this is a
    # valid spec before submitting.
    #
    # Any lines starting with a # are optional, but their use is encouraged
    # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
    #
    
    Pod::Spec.new do |s|
    #名称
      s.name             = 'XXXBaseIoTSocketManager'
    #这一块看个人需求,想要的起始分支。-版本号
      s.version          = '1.0.0'
    #剪短的介绍哟~
      s.summary          = '这里写你想要的简介。。。。'
    
    # This description is used to generate tags and improve search results.
    #   * Think: What does it do? Why did you write it? What is the focus?
    #   * Try to keep it short, snappy and to the point.
    #   * Write the description between the DESC delimiters below.
    #   * Finally, don't worry about the indent, CocoaPods strips it!
    #详细介绍
      s.description      = <<-DESC
                           这里写你想要的具体描述,有时候过短的话会有警告滴~~ 所以,不要逼summary短哟~~ 
                           DESC
    #s.homepage里面写你的git主页,注意是没有.git的哟~~ 一定要能访问到,要不然验证不通过
      s.homepage         = 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager'
    #截图
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
    #开源协议
      s.license          = { :type => 'MIT', :file => 'LICENSE' }
    #作者信息
      s.author           = { 'jiangsujia@126.com' => 'jiangsujia@126.com' }
    #项目地址,不支持SSH的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
      s.source           = { :git => 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager.git', :tag => s.version.to_s }
    #多媒体介绍地址
      # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
    #支持的平台及版本
      s.ios.deployment_target = '8.0'
    #代码文件地址,**/*表示Classes目录及其子目录下所有的文件,如果有多个目录则用逗号分组显示,这里也要做相应的设置
      s.source_files = 'XXXBaseIoTSocketManager/Classes/**/*'
      #资源文件地址
      # s.resource_bundles = {
      #   'XXXBaseIoTSocketManager' => ['XXXBaseIoTSocketManager/Assets/*.png']
      # }
    #公开头文件
      # s.public_header_files = 'Pod/Classes/**/*.h'
    #buildsetting相关设置
    #s.xcconfig = {
    #    'ENABLE_BITCODE' => 'NO',
    #    'CLANG_CXX_LIBRARY' => 'libstdc++'
    #}
    
    #该pod依赖的系统framework,多个用逗号分隔开
    # s.frameworks = 'UIKit', 'MapKit'
    #该pod依赖的系统Library,多个用逗号隔开
    #s.libraries = 'sqlite3',
    
    #第三方.a文件
    #s.vendored_libraries = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.a'
    
    #第三方frameworks文件
    #s.vendored_frameworks = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.framework'
    
    #依赖关系,该项目所依赖的其他库,如果有多个则需要填写多个s.dependency
      s.dependency 'CocoaAsyncSocket', '~> 7.6.3'
    end
    
    3.更新依赖关系

    配置完成后,再次cd到Example文件夹下,更新pod:

    jiangsjdeiMac:Example jiangsj$ pod update --no-repo-update
    

    更新完成后打开项目能否正常运行,并验证导入的文件是否能调用

    Podfile如下:

    use_frameworks!
    
    platform :ios, '8.0'
    
    target 'XXXBaseIoTSocketManager_Example' do
      pod 'XXXBaseIoTSocketManager', :path => '../'
      pod 'CocoaAsyncSocket', '~> 7.6.3'
    
      target 'XXXBaseIoTSocketManager_Tests' do
        inherit! :search_paths
    
        pod 'FBSnapshotTestCase'
      end
    end
    

    你会发现,实际上按照当前的podfile进行update后,会报错如下:


    图7

    建议先把下面这行在Podfile中注释了,然后执行update,但是你会发现目录下的Development Pods 没有了,然后再把这行打开,再update,就可以展示完整依赖了。

    #先注释此行,pod update , 然后再打开注释, 再pod update 
      pod 'XXXBaseIoTSocketManager', :path => '../'
    

    最终,终端如图8显示:


    图8

    三、提交到私有仓库


    1.验证pod配置文件,为了保证项目正确性,pod文件配置没问题
      1.cd 到你有XXXBaseIoTSocketManager.podspec的文件夹下
      2.运行pod lib lint XXXBaseIoTSocketManager.podspec 
    ps:
      1.如果出错了,就按照提示修复错误,但是有可能没有错有warnings,比如http什么的,       
      2.那么可以执行 pod lib lint XXXXBaseIoTSocketManager.podspec --allow-warnings
    

    还有几个本地验证命令推荐如下:

    #本地验证
    pod lib lint
    #本地验证+详细打印信息
    pod lib lint --verbose
    #本地验证+允许使用静态库
    pod lib lint --use-libraries
    #本地验证+允许警告
    pod lib lint --allow-warnings
    #本地验证+快速验证
    pod lib lint --quick
    

    整个过程如图9所示:


    图9

    由于我这里有警告所以我就用了--allow-warinings


    图10

    当出现XXX passed validation的时候,就验证通过了。

    事实上如果你引用了一堆你私有的库而pod库search不到,这步lint就会出现问题。
    我试过很多办法,仍旧是报错,其实,可以简化这步,如果你能保证你的库绝对没有问题,不执行lint也可以的。

    2.发布项目到私有库中,此时切换公司内网。
    1.添加远程仓库,就是之前我们在内网建的库
    git remote add origin 你的仓库地址.git
    2.添加文件
    git add .
    3.提交本地,并且添加描述
    git commit -m "第一次提交"
    4.推送本地代码到远程
    git push origin master
    5.打tag
    git tag 1.0.0
    6.推送tag到远程
    git push origin 1.0.0
    

    然后打开你的仓库地址,就可以看到我们的代码已经提交上去了,如图11。


    图11

    由于我上面.podspec文件填写的是branch是1.0.0,我又减了一个1.0.0分支。

    3.创建Spec的管理库。

    创建本地执行Spec命令

    pod repo add XXXBaseIoTSocketManager(你的库名称) http://XXXX.git(你的库地址)
    

    接下来就可以发布了

    将自己的私有库添加到Spec管理中
    pod repo push XXXBaseIoTSocketManager(你的库名称) XXXBaseIoTSocketManager.podspec
    

    这步其实也不是必须的,因为我是将git管理clone到本地,所以本步骤省略也无所谓。

    4.检验私有库的发布跟使用

    在私有库引用了私有库的情况下,在验证和推送私有库的情况下都要加上所有的资源地址,不然pod会默认从官方repo查询。

    pod spec lint --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
    pod repo push 本地repo名 podspec名 --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
    
    5.引用自己或第三方的framework或.a文件

    在podsepc中应该这样写:

    s.ios.vendored_frameworks = "xxx/**/*.framework"
    s.ios.vendored_libraries = "xxx/**/*.a”
    
    6.私有库中添加资源(图片、音视频等)

    方法有三种:

    • 第一种
    spec.resources = ["Images/*.png", "XXX/*"]
    

    但是这些资源会在打包的时候直接拷贝的app的Bundle中,这样说不定会和其它资源产生命名冲突

    • 第二种
    spec.resource = "Resources/MYLibrary.bundle"
    

    把资源都放在bundle中,然后打包时候这个bundle会直接拷贝进app的mainBundle中。使用的时候在mainBundle中查找这个bundle然后再搜索具体资源

     NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"XXXBundle" withExtension:@"bundle"];
        NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
        UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
    
    • 第三种
    spec.resource_bundles = {
      'xxxx' => ['Resources/*.png'],
      'OtherResources' => ['OtherResources/*.png']
    }
    

    这种方法利用 framework 的命名空间,有效防止了资源冲突。
    使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 对象,再搜索具体资源

    NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
    NSURL *bundleURL = [bundle URLForResource:@"xxxx" withExtension:@"bundle"];
    NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
    UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
    
    7.检验私有库的发布跟使用

    在项目中的Podfile中添加

    pod 'xxxBaseIoTSocketManager', :git => 'http://xxxx/XXXBaseIoTSocketManager.git', :branch =>'1.0.0'
    

    如下图12所示:


    图12

    工程如下13图所示:


    图13

    导入成功就可以使用了。

    但是要注意的是,如果你要是在库中引用了三方库,那么你要提前在外网把三方库的引入在你的工程中引入一遍,注释后再切换到内网。如果你这个库引用了私有库,也一并pod进来就好了,注意是显式pod。

    部分参考了如下,关于使用私有库遇到的问题,本文只做记录:
    https://www.jianshu.com/p/1e5927eeb341

    相关文章

      网友评论

          本文标题:cocoaPods私有库创建以及使用,多重库引用

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