【iOS】使用cocoapods创建私有库/公有库 2020.05

本文源自weicy,转载请注明出处
一般来说一个公司不只有一个产品,当项目很多后,我们就要考虑代码的共用,我们需要把一些通用的功能抽离成一个公共类,或者把一些功能做成组件,方便不同产品的使用或者分离。这也就是组件化的一些功能。iOS组件化实现基本基于cocoapods,如何使用cocoapods创建自己的组件库,是实现组件化的第一要素。下面我们就来创建下自己的仓库吧。

  1. 创建私有库的索引库

    • 准备一个私有库地址,内部有权限限制的仓库即可。意思就是我们把抽离出的代码放到github、gitlab、coding等代码托管平台上

      alt 我的仓库

      如图我是在github上创建的。

  2. 将创建的索引库添加到本地的cocoapods仓库

    • 查看本地索引库

      pod repo

      用上面的命令就能查出你当前电脑的本地索引库了

    • 添加本地索引库

      pod repo add 索引库名称 远程索引库地址

      例子:pod repo add CommonToolRepo https://github.com/xxx/CommonToolRepo.git

      注意点: DFSpecs 是一个索引库,用来管理你的所有的私有pod 仓库的podspec文件的,执行完上面第2步,会在~/.cocoapods/repos 目录下自动生成DFSpecs 本地仓库

  3. 创建模板

    • 创建模板这一步很简单,就是在某个位置创建一下我们代码。
    $ cd ~/Desktop/
    //这个命令的作用是创建一个pod项目,它会自动给你生成spec文件
    $ pod lib create DYCategoryKit
    //pod lib create NAME使用默认模版,如果想使用其他模版,可以添加--template-url=URL参数。
    //pod lib create NAME:创建标准目录结构、模板文件。pod lib create NAME不是创建pod的唯一方法,但它是最简洁的方法
    
    • 我是在桌面创建的这个文件。如果这一步成功的话会有下面的图
    alt 成功创建模板图
What platform do you want to use?? [ iOS / macOS ]
 选择iOS,直接回车默认选择第一个
What language do you want to use?? [ Swift / ObjC ]
 选择Swift。CocoaPods会把你的库设置为framework
Would you like to include a demo application with your library? [ Yes / No ]
  选择Yes。如果你想要包含一个示例工程,或计划在app中测试你的库,这里需要选择Yes,以便模板文件为你的库创建Xcode工程。也就是如果你计划为pod添加截图,这里需要选择Yes。
Which testing frameworks will you use? [ Quick / None ]
  选择Quick。提交库到CocoaPods前应当进行测试。CocoaPods推荐使用其附带的测试framework,而非Apple的XCTest。在Objective-C中,可以选择Specta/Expecta或Kiwi,其区别如下:
Specta/Expecta:通过不同podspecs的模块化方法。
Kiwi:是对Stubs/Mocks/Expections的一种一体化方法。
CocoaPods已经在MyLib-Tests.pch文件中添加了所有必要的包含和设置,因此不必将它们包含在每个文件中。
但是由于现在的cdn问题有时候会不成功,我这边使用的是
None
Would you like to do view based testing? [ Yes / No ]
  选择Yes。根据你建立的仓库,你可能会发现基于快照的测试是验证视图不同部分不同操作的最佳方法,这里建议使用FBSnapShotTestCase。如果你使用的是Specta/Expecta,那么其会包含一个pod来改进语法。

What is your class prefix?
  如果你选择的语言是ObjC,其最后会要求提供类前缀。你只要输入一个前缀即可
  • 选项填完之后回车,会自动创建一个项目,名称就是CommonTool
  1. 将我们代码放入指定目录

    打开桌面上的CommonTool,我们可以发现里面有一些文件,但是关键的文件夹就是CommonTool。这个文件夹中有两个文件夹(Assets和Classses)。

    Assets:存放图片资源等等
    Classes:存放源码,默认会有一个ReplaceMe.m文件 (比如SDWebImage pod里的类文件)可以删除这个文件
    

    我们只要把需要上传的代码放入Classes文件夹中即可。然后进入Example文件夹,首次使用pod install进行安装,然后可以正常的引用和写测试代码。把你的demo修改的更完美,当然更重要的一点是保证没有错误。

  2. 在github或gitlab上创建新的pod项目

    这里你会发现,我又重新创建了一个项目,和我之前创建的索引库项目是不一样的,这个就是真正放置我们封装的代码的地方

    我的地址为https://github.com/***/CommomTool.git

  3. 修改模板文件相关信息

    进入CommonTool项目,使用xcode打开。找到.podspec文件,这里可以用Sublime Text或者Xcode (文本编辑器不推荐,因为可能会改变"的格式,造成lint不通过),我这里直接在xcode中进行更改,根据你的需要进行相应更改。

    s.summary,这个是显示在pod search的简短描述,

    s.version是版本号,第一次默认是0.1.0不用修改,如果不是请修改为对应版本,

    s.homepage和s.source中的地址为我们创建组件仓库的地址即可!

    #
    # Be sure to run `pod lib lint CommonTool.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             = 'CommonTool'
      s.version          = '1.1.2'
      s.summary          = 'A fairly complete class of common tools and extensions tool'
    
      s.description      = <<-DESC
                            'my daily development.'
                            DESC
    
      s.homepage         = '``` https://github.com/***/CommomTool.git```'
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
      s.license          = { :type => 'MIT', :file => 'LICENSE' }
      s.author           = { '***' => '**@163.com' }
      s.source           = { :git => ' https://github.com/***/CommomTool.git', :tag => s.version }
      s.social_media_url = '你的地址'
    
      s.ios.deployment_target = '9.0'
    
      s.source_files = 'CommonTool/Classes/**/*'
      
      # s.resource_bundles = {
      #   'CommonTool' => ['CommmonTool/Assets/*.png']
      # }
    
      # s.public_header_files = 'Pod/Classes/**/*.h'
      # s.frameworks = 'UIKit', 'MapKit'
      # s.dependency 'AFNetworking', '~> 2.3'
    end
    
    
  4. 验证spec文件

    终端进入CommonTool文件夹中进行pod lib lint来进行验证。一般来说会有warn。

    这时我们就需要输入````pod lib lint --allow-warnings ```来允许警告 这时一般来说就成功了。

    上面的警告一般都是因为我们没有在新的代码库中上传代码的原因。

    备注上面的这些命令可以加上--verbose来显示详情。

    显示下面这样就是成功的意思

     -> CommonTool (1.1.2)
    CommonTool passed validation.
    

    上面是建立本地测试,我们还需要进行仓库有效性验证pod spec lint

    使用方法和本地的一致

    当然在使用上面的方法过程中可能会出现下面的bug。

    使用命令 pod lib lint 时,出现警告: The URL () is not reachable。这是我们就加上后面的--allow-warnings

  5. 将制作好的组件上传到自己的git仓库

    cd  /Users/yourMacName/Desktop/CommonTool
    git remote add origin https://github.com/xxx/CommonTool.git
    git add .
    git commit -m "注释描述"
    git push origin master
    //注意:如果你创建项目的时候生成了README或者license文件,那么这里你push的时候可能会push不了,如是你可用
    git push origin master -f 强制提交,会覆盖之前的文件
    
  6. 给版本打一个分支

    为仓库打tag,这个tag需要和spec文件中的版本保持一致

    git tag -m "你的描述" 1.1.2
    git push --tags
    
  7. 建立关联

    将你项目中的spec文件push到第一步创建的私有库进行管理,可以用pod repo 命令查看你的私有库

    在终端执行pod repo push <本地索引库> <索引文件名>, 提交索引文件到远程索引。例如pod repo push CommonToolRepo CommonTool.podspec

    通过这一步我们就同步好了远程和本地索引库,到此,私有库已经制作完毕!

  8. 使用自己的私有库

    到了这一步我们就可以使用自己的私有库了,

    创建成功之后可能会出现search不到的情况,此时可删除本地搜索索引,然后再进行搜索

    rm ~/Library/Caches/CocoaPods/search_index.json
    pod search DYCategoryKit
    

    如果还是不行那就全清

    pod cache clean --all 
    rm -rf ~/Library/Caches/CocoaPods/search_index.json
    pod repo remove trunk
    pod repo update
    

    这样基本上就出来了

    私有仓库的使用你应该懂的,需要在Podfile添加source源

    //如果还要添加公有pod,还需要加上这行
    source 'https://github.com/CocoaPods/Specs.git'
    //私有pod仓库索引
    source 'https://github.com/***/CommonToolSpecs.git'
    platform :ios, "9.0"  
    target "XXX" do  
        pod 'CommonTool'
    end
    
  9. 发布到cocoapods,成为公开库

    如果要添加到Cocoapods的官方库了,可以使用trunk工具,具体可以查看官方文档

    上面我们已经将代码源用podspec文件管理起来了。要让其他人能下载使用你的代码,就要让他找到podspec文件,所以我们要讲podspec文件放在网络上托管起来。

    私有库只能放在公司或个人的git仓库,如果没有权限就不能使用,那么我们如果想要多人使用怎么办。就需要将podspec文件放到cocoapods公有库中

    1. 第一步注册cocoapods

      pod trunk register 邮箱地址 '用户名' --verbose
      加上--verbose可以输出详细debug信息,方便出错时查看。也可以不加
      

      这里我们一般使用github邮箱和用户名, 然后在你的邮箱中会收到确认邮件, 在浏览器中点击链接确认即注册成功

    2. 验证cocoaPods

      确保打开了邮件中的链接之后(正常加载出来就行),继续执行命令

      pod trunk me
      

      这是你会看到一下信息,如果没错就成功了。

    3. 发布

      发布时会验证 Pod 的有效性,如果你在上面步骤中手动验证 Pod 时使用了 --use-libraries 或 --allow-warnings 等修饰符,那么发布的时候也应该使用相同的字段修饰,否则出现相同的报错。

      pod trunk push ***.podspec 
      

      [图片上传失败...(image-b98af5-1589509809908)]

      图是网上的 我的忘了截图。

    4. 这时候在pod trunk me就会看到你的详细信息了,里面包含这个库

  10. 删除私有库

    删除一个私有Spec Repo,只需要执行一条命令即可

    pod repo remove CommonToolSpec
    

    这样这个Spec Repo就在本地删除了,我们还可以通过

    $ pod repo add WTSpecs git@coding.net:wtlucky/WTSpecs.git 
    

    再把它给加回来。

    如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要cd到`~/.cocoapods/repos/CommonToolSpec目录下,删掉库目录

    ~/.cocoapods/repos/WTSpecs$ rm -Rf PodTestLibrary 
    

    然后在将Git的变动push到远端仓库即可

     git add --all . 
     git ci -m "remove unuseful pods"
     git push origin master
    

git添加远程库的时候有可能出现如下的错误。

git报错:'fatal:remote origin already exists'怎么处理。这个的解决方法也很简单git remote rm origin 我们先把之前的删除就行

本文源自weicy,转载请注明出处

参考:组件化探究值私有库的创建

git报错:'fatal:remote origin already exists'怎么处理?附上git常用操作以及说明

创建私有库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345