美文网首页iOS应用框架iOS Developer
2、教你一步步用CocoaPods创建远程私有库

2、教你一步步用CocoaPods创建远程私有库

作者: 踩坑小分队 | 来源:发表于2017-05-17 20:20 被阅读618次

    上一章介绍了1、教你一步步用CocoaPods创建远程公有库,应该对远程的公有库的上传和下载步骤有了一个大致的了解了。
    随着我们的业务的增多,我们的app数量可能会增加,复用相关的模块代码这个时候就变得更迫切<工具类,网络请求类等>。所以我们就可以把我们之前的app中使用到的封装的相关的类提取出来放到多个app中使用,但是分散到多个app中维护起来还是比较麻烦的,以后涉及到统一的维护,统一的升级,一个个去修改那就太麻烦了。而我们又不能将我们的代码上传到远程公开的库中用CocoaPods来进行维护,而这个时候需要使用私有仓库来保存我们的代码。
    用CocoaPods创建远程私有库
    对比CocoaPods创建远程公有库我们可以很快的上手用CocoaPods创建远程私有库原理大同小异。
    主要相关的区别在图中已经标明。

    image.png
    1、D盛放索引列表的远程仓库不再是 CocoaPods的官方的spec列表仓库,而是我们自己的远程私有仓库
    2、B公开的代码不是放在公开的git上面的仓库上,而是放在我们自己的私有仓库
    3、我们要将我们的代码对应的.podspec文件上传到D我们的远程私有仓库索引列表中。

    不要晕,这里有两个私有的远程仓库,一个是用来盛放我们的封装的代码的,另外一个是用来代替CocoaPods的. podspec仓库,盛放我们私有的. podspec文件的。

    那么我们需要做的工作包括以下几点
    1>、创建一个本地的仓库,将自己想要公开的代码搞进去。
    2>、修改.podSpec描述文件中的相关的描述信息
    3>、将自己的封装的代码上传到远程私有仓库中去
    4>、创建一个远程私有仓库,用来扮演CocoaPods官方的索引库
    5>、将当前本地的.podSpec文件传到创建的私有远程仓库<用来扮演CocoaPods官方的索引库>
    6>、测试一下,有没有上传到私有远程仓库的索引库中
    7>、后期的升级维护

    具体的步骤如下所示:
    1>、创建一个本地的仓库,将自己想要公开的代码搞进去。
    1.1、到相关的目录下面创建一个pod模板,终端执行下面的命令:

    pod lib create DownLoader
    

    之后他会问你五个问题,
    1、选择语言
    2、是否需要一个例子工程;
    3、选择一个测试框架;
    4、是否基于View测试;
    5、类的前缀;
    这几个问题的具体介绍可以去看官方文档,问完这5个问题他会自动执行pod install命令创建项目并生成依赖。

    pod lib create DownLoader
    Cloning `https://github.com/CocoaPods/pod-template.git` into `DownLoader`.
    Configuring DownLoader template.
    
    ------------------------------
    
    To get you started we need to ask a few questions, this should only take a minute.
    
    If this is your first time we recommend running through with the guide:
     - http://guides.cocoapods.org/making/using-pod-lib-create.html
     ( hold cmd and click links to open in a browser. )
    
    
    What language do you want to use?? [ Swift / ObjC ]
     > ObjC
    
    Would you like to include a demo application with your library? [ Yes / No ]
     > Yes
    
    Which testing frameworks will you use? [ Specta / Kiwi / None ]
     > Specta
    
    Would you like to do view based testing? [ Yes / No ]
     > Yes
    
    What is your class prefix?
     > ZY
    
    Running pod install on your new library.
    
    Analyzing dependencies
    Fetching podspec for `DownLoader` from `../`
    Downloading dependencies
    

    生成的项目,自动生成一个仓库,测试Demo集成了CocoaPods,以及创建好了相关的####.podspec描述文件

    image.png

    1.2、将自己要封装的代码放到下面的目录,并且删除ReplaceMe.m

    image.png
    1.3、这个时候我们的自动生成的测试项目中是看不到我们刚刚放到Classes目录下面的东西的。需要执行一下Example下面的Podfile文件。
    image.png
    执行完毕之后打开Example项目
    image.png
    可以在这其中进行相关的调试,来修改我们准备封装的代码。因为 image.png

    发现对应的是这个路径下的代码

    image.png

    调试完毕,确认准备封装的代码没有bug,进行下一步。

    2>、修改.podSpec描述文件中的相关的描述信息
    详情可参考CocoaPods的官网的PodSpec语法.podspec可以选择使用Xcode进行打开修改
    2.1、这里面主要注意这么几个地方就可以了

    
    Pod::Spec.new do |s|
      # 项目的名称
      s.name             = 'DownLoader'
      # 项目的版本号,通过项目git的tag标签进行对应,这里的标签代表的版本
      s.version          = '0.1.0'
      # 项目简单的描述信息
      s.summary          = '简单的下载器'
    
      # 项目的详细描述信息,注意,这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
      s.description      = <<-DESC
    简单的下载器,支持断点下载
                           DESC
      # 项目的网页主页信息,这里可以直接写自己的远程仓库的主页的地址
      s.homepage         = 'https://coding.net/u/*******/p/DownLoader'
      # 截图
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
      # 开源协议
      s.license          = { :type => 'MIT', :file => 'LICENSE' }
      # 作者信息
      s.author           = { 'zy_ios@163.com' => 'zy_ios@163.com' }
    
      # 这个比较重要,指的就是git的对应的远程仓库的地址以及版本号,版本号直接获取的是上面的s.version
      # 项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
      s.source           = { :git => 'https://git.coding.net/*******/DownLoader.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 = 'DownLoader/Classes/**/*'
    
      # 资源文件地址
      # s.resource_bundles = {
      #   'DownLoader' => ['DownLoader/Assets/*.png']
      # }
      # 公开头文件地址
      # s.public_header_files = 'Pod/Classes/**/*.h'
      # 所需的framework,多个用逗号隔开
      s.frameworks = 'UIKit'
      # 依赖关系,该项目所依赖的其他,当在加载的时候也会一块把相关的依赖的库加载下来,如果有多个需要填写多个
      # s.dependency 'AFNetworking', '~> 2.3'
      # s.dependency 'YYModel'
      # 是否使用ARC,如果指定具体文件,则具体的问题使用ARC
      s.requires_arc = true
    end
    

    2.2、修改完毕之后进行检验一下.podspec的格式有木有问题

    pod lib lint
    

    通过


    image.png

    具体的错误原因可以根据相关的提示进行修改,但是有的时候没有错误,有的是一堆的警告,如下所示:


    image.png
    换一种检验的方式,忽略所有的警告进行格式的检验
    pod lib lint --allow-warnings
    

    3>、将自己的代码上传到远程私有仓库中去
    3.1、创建一个远程私有仓库,远程私有仓库可以选择
    bitbucket或者 Coding,我这里选择Coding

    image.png

    3.2、创建完远程私有仓库,将本地的仓库和远程创建的私有远程仓库绑定

    git remote add origin https://git.coding.net/WANG19931123/DownLoader.git
    git remote
    git push origin master
    

    当我们 git push origin master的时候尴尬了,报错了。

    image.png
    具体的原因是:
    因为我之前使用的是bitbucket的代码管理平台,同样都是git,用户名和密码都被记在了本地,所以当执行push操作的时候会导致默认使用bitbucket的用户名和密码为了不和bitbucket冲突,这里我们使用ssh进行验证。
    首先
    创建一对公钥私钥
    然后将创建的公钥传到我们的私有仓库设置中,私钥留在本地。 image.png
    使用SSH的方式访问仓库
    image.png
    将当前的本地仓库的东西上传到远程私有仓库。
    3.3、给当前代码打一个tag标签,然后push到远程仓库
    注意的是,打的标签一定要和当前的. podspec文件对应
    image.png

    4>、创建一个远程私有仓库,用来扮演CocoaPods官方的索引库
    4.1、在Coding创建私有仓库

    image.png
    4.2、将当前的远程仓库,同步到本地
    终端运行如下命令
     pod repo
    

    可以看到当前所有的spec对应的本地仓库,可以看到他们的本地路径和远程url各自对应的是啥。


    image.png

    进入如下路径:

    image.png
    将刚刚创建的远程仓库,clone到repos下面,和master同级。
    这里同样还是使用SSH 方式访问仓库
    创建一对公钥私钥
    git clone git@git.coding.net:WANG19931123/PrivateSpecsGather.git
    

    5>、将当前本地的.podSpec文件传到创建的私有远程仓库<用来扮演CocoaPods官方的索引库>
    5.1、到.podspec文件的目录下面
    5.1.1、首先先检测一下.podspec的远程仓库是不是可以用

    pod spec lint
    
    image.png
    发现报错了。又是一个坑。
    为啥会报错呢?因为上面我们就写明原因了。
    因为我之前使用的是bitbucket的代码管理平台,同样都是git,用户名和密码都被记在了本地,所以当对coding私有仓库的操作的时候,导致默认使用bitbucket的用户名和密码。
    虽然我们的测试项目通过SSH进行远程仓库的操作<push或者pull>,但是.podspec里面的source的git地址还是不行,并且source的git地址不支持SSH格式。
    所以,我们还是不能逃避问题,还是得用http格式操作git仓库,不能使用SSH方式来操作。
    解决这个git的多帐号密码冲突的问题,参考
    我选用的是第一种方法,因为第二种方法,没有成功,如果你知道,记得告诉我。直接修改.podspec的地址形式为
    s.source = { :git => 'http://yourname:password@git.oschina.net/name/project.git', :tag => s.version.to_s }

    再次执行

    pod spec lint
    

    运行通过


    image.png

    5.1.2、将当前本地的.podSpec文件传到创建的私有远程仓库
    检查当前所有的spec文件夹

    pod repo
    
    image.png
    pod repo push PrivateSpecsGather DownLoader.podspec --allow-warnings
    
    image.png
    6>、测试一下,有没有上传到私有远程仓库的索引库中
    image.png

    检测一下查询结果

    pod search DownLoader
    
    image.png

    找一个继承了CocoaPods的项目,进行更新操作,失败了

    image.png

    失败的原因是因为,找不到我们的downloader的描述文件的位置。
    因为我们没有指定相关的source地址,具体的修改操作见下图


    image.png

    可是这个时候,我们去更新一个AFNetWorking试一下,失败了。


    image.png

    原因是,因为AFNetWorking的位置是CocoaPods的公开spec仓库中的,而我们上面仅仅只是指定下面的pods的来源是我们自己私有的仓库,所以,需要添加上CocoaPods的公开spec仓库的git地址。
    PS:Podfile文件上面不指定Source,默认就是CocoaPods的公开spec仓库的git地址
    这样配置就好了

    source 'git@git.coding.net:WANG19931123/PrivateSpecsGather.git'
    source 'https://github.com/CocoaPods/Specs.git'
    
    target 'PrivatePodsDemo' do
      # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
      # use_frameworks!
    
      # Pods for PrivatePodsDemo
      
      pod 'DownLoader', '~> 0.1.0'
      pod 'AFNetworking', '~> 3.1.0'
      
    end
    
    image.png

    7>、后期的升级维护
    7.1、后期先更新自己的本地私有库,更新完毕之后,推送到自己的远程私有仓库。
    7.2、编辑对应的.podSpec文件,升级一个version,对应的,给最新的代码添加一个tag。当然了和对应的version对应。
    7.3、推送到盛放私有spec的私有仓库

    当然了,你想把你 封装的私有库给其他的小伙伴用,你至少得给别人权限,让别人能够访问你的两个私有库。

    pod repo push $$$$  ####.podspec --allow-warnings
    

    扩展:实现CocoaPods的subspec分支功能
    扩展:使用CocoaPods集成的远程私有公有库如何使用图片资源

    如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。在下不甚感激。

    相关文章

      网友评论

      • zwing:在工程里的Example中不能使用这个pod私有库吗?我导入头文件没反应
      • 六度Space:楼主,在执行"git push origin master"的时候,报了这个错
        error: failed to push some refs to 'git@git.coding.net:sherytom/MD5String.git'
        hint: Updates were rejected because the remote contains work that you do
        hint: not have locally. This is usually caused by another repository pushing
        hint: to the same ref. You may want to first integrate the remote changes
        hint: (e.g., 'git pull ...') before pushing again.
        hint: See the 'Note about fast-forwards' in 'git push --help' for details.
        请问这个咋个解决呀?
        踩坑小分队:正确步骤:
        1. git init //初始化仓库

        2. git add .(文件name) //添加文件到本地仓库

        3. git commit -m "first commit" //添加文件描述信息

        4. git remote add origin + 远程仓库地址 //链接远程仓库,创建主分支

        5. git pull origin master // 把本地仓库的变化连接到远程仓库主分支

        6. git push -u origin master //把本地仓库的文件推送到远程仓库

        这样试试
      • 开飞机的叔客:学习学习,成功了

      本文标题:2、教你一步步用CocoaPods创建远程私有库

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