美文网首页生活必备cocoapodsiOS Developer
从零用CocoaPods创建私有索引库

从零用CocoaPods创建私有索引库

作者: 01_Jack | 来源:发表于2017-06-17 10:57 被阅读888次
    前言

    什么是索引库?为什么要创建私有索引库?终端输入pod repo,如果之前没有配置过,输出信息为:

    master
    - Type: git (master)
    - URL:  https://github.com/CocoaPods/Specs.git
    - Path: /Users/Jack/.cocoapods/repos/master
    

    浏览器打开https://github.com/CocoaPods/Specs,可以看到一个Specs文件夹,文件夹内包含目前所有支持CocoaPods框架的索引,但https://github.com/CocoaPods/Specs.git是公开索引库,只能添加公开(开源)框架,如果想让私有框架支持CocoaPods,这个时候必须用私有索引库。

    正文

    如果私有框架已经存在,只需进入对应本地项目根目录,创建podspec填写正确信息后上传,并将podspec文件push到私有索引库即可。

    pod spec create [podspec文件名]   //创建podspec
    pod lib lint    //podspec本地验证
    pod spec lint     //podspec远程验证
    git add .
    git commit -m xx
    git push origin master
    pod repo push [私有索引库]  [podspec文件]    //将podspec文件push到私有索引库
    

    如果从零开始创建私有框架,可以按以下步骤执行:

    (以下均以TestLib为例,请自行替换)

    终端进入准备创建lib的文件夹,执行命令

    pod lib create TestLib
    

    这个过程可能需要等待几秒,之后会出现如下信息:

    What language do you want to use?? [ Swift / ObjC ]
    Would you like to include a demo application with your library? [ Yes / No ]
    Which testing frameworks will you use? [ Specta / Kiwi / None ]
    Would you like to do view based testing? [ Yes / No ]
    

    根据提示输入即可,完成后会自动打开TestLib对应的Example工程

    执行tree命令查看目录结构

    01:TestLib Jack$ tree TestLib -L 2
    TestLib
    ├── Example
    │   ├── Podfile
    │   ├── Podfile.lock
    │   ├── Pods
    │   ├── TestLib
    │   ├── TestLib.xcodeproj
    │   ├── TestLib.xcworkspace
    │   └── Tests
    ├── LICENSE
    ├── README.md
    ├── TestLib
    │   ├── Assets
    │   └── Classes
    ├── TestLib.podspec
    └── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
    
    10 directories, 5 files
    

    将组件放入TestLib/Classes中,并删除ReplaceMe.m,进入Example文件夹执行pod install后,TestLib对应的Example工程已经装载好,可以进行demo演示。以后每次更新lib,都需要进到Example中执行pod install获取最新代码

    TestLib/Classes
    • 创建远程私有库

    由于github创建私有库需要付费,这里用coding进行演示

    远程私有库

    这里README.md、开源许可证、gitignore都不需要添加,从上面TestLib的目录结构可以看到,pod lib create已经创建了这三个文件,如果添加,在commit时候会导致冲突(文件内容不完全相同),所以只要创建一个最干净的私有库。

    • 修改podspec文件
    
    Pod::Spec.new do |s|
      s.name             = 'TestLib'
      s.version          = '0.1.0'
      s.summary          = 'TestLib'
    
      s.description      = <<-DESC
    TestLib只是一个演示
                           DESC
    
      s.homepage         = 'https://coding.net/u/coder_01/p/TestLib'
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
      s.license          = { :type => 'MIT', :file => 'LICENSE' }
      s.author           = { '01_Jack' => '123@qq.com' }
      s.source           = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
      # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
    
      s.ios.deployment_target = '8.0'
    
      s.source_files = 'TestLib/Classes/**/*'
      
      # s.resource_bundles = {
      #   'TestLib' => ['TestLib/Assets/*.png']
      # }
    
       s.public_header_files = 'Pod/Classes/**/*.h'
      # s.frameworks = 'UIKit', 'MapKit'
      # s.dependency 'AFNetworking', '~> 2.3'
    end
    
    
    • 对podspec进行本地验证:
    pod lib lint --private
    

    如果因为waring验证不通过可以加上--allow-warnings,远程验证和pod repo push同理

    • 打包

    验证通过后打包类库,这里可以用cocoapods的插件cocoapods-packager来完成(手动打包太麻烦)。如果之前没有安装cocoapods-packager,执行以下命令:

    sudo gem install cocoapods-packager
    

    打包:

    pod package TestLib.podspec  --force
    

    默认打包成.framework,如果加上--library则打包成.a

    验证通过后,通过git status可查看当前git改变状态,不需要提交的文件可添加到gitignore中。

    git status
    git add .
    git commit -m 'first blood'
    

    到这里已经可以将代码提交到远程仓库,但需要先添加仓库地址再提交

    • 添加公钥
    ssh-keygen
    

    将生成的公钥id_rsa.pub添加到账户

    添加公钥
    git remote add origin git@git.coding.net:coder_01/TestLib.git
    git push origin master
    

    在对podspec做远程验证前要先push tag,tag必须与podspec中的version一致

    git tag 0.1.0
    git push --tags
    pod spec lint --private
    

    远程验证通过后,将TestLib.podspec push到远程私有索引库,同样,需要先添加仓库再push

    • 创建私有索引库
    私有索引库
    pod repo add PrivateSpecs git@git.coding.net:coder_01/PrivateSpecs.git
    pod repo push PrivateSpecs TestLib.podspec
    

    此时本地索引库长这样

    cd ~/.cocoapods/repos
    open .
    
    PrivateSpecs

    最基本的制作到这里就完成了,现在能搜到TestLib这个库

    pod search TestLib
    
    pod search

    新建工程,pod init,修改podfile文件。这里需要添加两个source,一个原master repo,一个后添加的PrivateSpecs

    source 'git@git.coding.net:coder_01/PrivateSpecs.git'
    source 'https://github.com/CocoaPods/Specs.git'
    
    use_frameworks!
    
    target 'Test' do
    pod 'TestLib'
    end
    

    执行pod install即可使用TestLib框架

    Tip:如果组件中含有图片、音视频、xib/storyboard等,podspec的描述与代码中的写法都需要改变

    重新回到podspec文件

      s.source_files = 'TestLib/Classes/**/*'
    
      # s.resource_bundles = {
      #   'TestLib' => ['TestLib/Assets/*.png']
      # }
    

    s.source_files用来找代码,s.resource_bundles用来找资源。
    TestLib/Classes/**/*表示匹配TestLib/Classes文件夹下所有子目录的所有文件

    Pattern:*
    • *匹配所有文件
    • c*匹配所有以c开头的文件
    • *c匹配所有以c结尾的文件
    • *c*匹配所有包含c的文件
    Pattern: **
    • **递归匹配所有子文件夹

    未组件化前,加载图片、音视频、xib/storyboard等资源可通过mainBundle来加载,现在要通过组件自带bundle来获取资源。TestLib会自动将s.resource_bundles下指定的路径资源打成bundle包,并命名为TestLib.bundle

    s.resource_bundles

    但是,并不一定要把资源放到Assets文件夹下,可以是任意文件夹(如目录结构中的Classes或者新建),只要能找到资源即可。同样,如果包含资源s.source_files要这样写:

     s.source_files = 'TestLib/Classes/**/*{.h,.m}'
    

    如果不这样写,若Classes中包含资源文件,会导致崩溃。此时先找到TestLib.bundle,再从这个bundle中加载资源就可以了

    // 获取bundle资源
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    

    podspec还有一些常用玩法,如subspecdependencyvendored_frameworksvendored_librariesprefix_header_contentsprefix_header_file

    podspec更多配置可参考Podspec Syntax Reference

    Have fun !

    相关文章

      网友评论

      • 简书lu:我现在是把storyboard转化为bundle了,然后podspec是这样写的s.resource_bundles = {
        'LBCityChooseView' => ['LBCityChooseView/Classes/LBCityChooseView.bundle']
        }
        我想知道在代码里面怎么加载这个Storyboard啊
      • 简书lu:Storyboard文件也是这样// 获取bundle资源
        NSBundle *bundle = [NSBundle bundleForClass:[self class]];加载吗
      • 简书lu:TestLib会自动将s.resource_bundles下指定的路径资源打成bundle包,并命名为TestLib.bundle

        这句话的意思是不需要我们自己将资源文件转化为bundle文件吗

      本文标题:从零用CocoaPods创建私有索引库

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