美文网首页iOS开发技巧ios专题
Cocoapods 创建私有库实现项目模块化管理

Cocoapods 创建私有库实现项目模块化管理

作者: 犯傻小二 | 来源:发表于2016-06-20 11:13 被阅读2061次

    前言

    项目私有化目的

    项目书写的时候肯定是刚开始比较简单,功能也比较少,模块比较少肯定能满足项目的需求,随着项目模块的增多,项目的代码量也逐渐增加,很有可能会有多人进行开发,提交合并代码会很头痛,模块化给我们一个很好的解决方式,让我们开始吧。

    创建私有库 spec repo

    spec repo 是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,他实际是一个Git仓库remote端 在GitHub上,但是当你使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的

    #~/.cocoapods/repos 大致目录是这样的
    ├── Specs 
             └── [SPEC_NAME] 
                      └── [VERSION] 
                               └── [SPEC_NAME].podspec
    

    所以我们需要创建一个类似master结构的spec repo github 私有仓库是收费的, 我选择了Coding 还有其他的服务 像 gitLab、开源中国、Bitbucket、CSDN。

    在terminal创建 repos

    # pod repo add [Private Repo Name]  [HTTPS clone URL]
    $ pod repo add WMCommon https://git.coding.net/fufu62/WSPCommon.git
    

    此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到WMCommon这个目录了。至此第一步创建私有Spec Repo完成。

    创建 podspec 文件

    已经有了现成的项目,需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,官方文档在这里

    在本地项目目录下创建
    $ pod spec create WPCommon
    

    执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。

    Pod::Spec.new do |s|
    s.name = "WPCommon"
    s.version = "0.2"
    s.summary = "the project for WPCommon"
    s.homepage = "https://git.coding.net/fufu62/WSPCommon.git"
    s.license = "MIT"
    s.author             = { "ISPWang" => "sanpeng123@126.com" }
    s.platform = :ios, "7.1"
    s.ios.deployment_target = "7.1"
    s.source = { :git => "https://git.coding.net/fufu62/WSPCommon.git", :tag => "0.1" }
    s.source_files = "CommonTest/CommonTest/Mine/Controller/**/*.{h,m}"
    s.frameworks = "UIKit"
    s.requires_arc = true
    end
    # 编辑完成之后使用验证命令验证一下
    $ pod lib lint
    WPCommon passed validation. #验证无错误
    # 可以进入下一步了。没有验证过去 根据错误提示进行修改 podspec文件
    

    本地测试pod spec文件

    我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式

    platform :ios, '7.1'
    pod ‘WPCommon', :path => ‘~/Code/WSPCommon/CommonTest'      # 指定路径
    pod 'WPCommon ', :podspec => '~/Code/WSPCommon/CommonTest/WPCommon.podspec'
    

    然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/WPCommon中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
    在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。

    提交步骤

    # 提交代码
    git add -A && git commit -m "Release 0.1"
    # 打tag
    git tag  -m “new version” ‘0.1'
    # 把tag推到远程仓库
    git push --tags
    # 将本地的master分支推送到远程仓库
    git push origin master
    

    Spec Repo提交pod spec

    向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令

    $ pod repo push WMCommon WPCommon.podsepc #前面是本地Repo名字 后面是pod spec名字
    完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/WTSpecs目录下查看

    .
    ├── LICENSE
    ├── WPCommon
    │      └── 0.1
    │               └── WPCommon.podspec
             └── 0.2
    │               └── WPCommon.podspec
    └── README.md
    

    再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。

    pod search WPCommon
    
    -> WPCommon (0.2)
       A short test for  of WPCommon.
       pod 'WPCommon', '~> 0.2'
       - Homepage: https://git.coding.net/fufu62/WSPCommon.git
       - Source:   https://git.coding.net/fufu62/WSPCommon.git
    
       - Versions: 0.2, 0.1 [WMCommon repo]
    

    使用制作好的Pod

    在Pod file 文件里增加私有库文件即可
    source 'https://github.com/CocoaPods/Specs.git'
    source 'https://git.coding.net/fufu62/WSPCommon.git'
    
    platform:ios,’8.0’
    target "cocoapodsTest" do
    pod 'MJRefresh'
    pod 'SDWebImage', '~> 3.8.1'
    pod 'WPCommon', '~> 0.2'
    end
    # 快速更新状态
    pod update --no-repo-update
    

    中间会出现警告—no-clean或者error ?

    Assuming you are using git for that repo, can you run git status? If the repo is clean it would say something like nothing to commit, working directory clean.
    Sorry, can you run git status --porcelain, that’s the exact command it runs

    pod repo push  WMCommon WMCommon.podspec --allow-warnings --verbose 
    // --allow-warnings : 允许 警告,有一些警告是代码自身带的。
    // --use-libraries : 私有库、静态库引用的时候加上 
    // —verbose : lint显示详情
    

    框架中如果使用Xib加载crash的情况
    出现通过mainBundle加载不了,无法获取Xib

      [NSBundle bundleForClass:[self class] 获取bundle 
    // 这样之后,无论是通过copy文件夹方式还是CocoaPods下载安装的方式,都能正常使用xib进行初始化了
    

    CocoaPods下载框架中图片无法正常显示通过ImageName

    • 通过CocoaPods下载安装,如果xib中直接填写好的图片,则图片资源能直接显示,如果通过代码"[UIImage imageNamed:@""]"去设置的话,则图片资源根本显示不了
    //改变代码图片路径
    // 图片路径
    #define WMCommonSrcName(file) [@"WMCommon.bundle" stringByAppendingPathComponent:file]
    #define WMCommonFrameworkSrcName(file) [@"Frameworks/WMCommon.framework/WMCommon.bundle" stringByAppendingPathComponent:file]
    WMCommonSrcName(file) 为通过copy文件夹方式获取图片路径的宏
    WMCommonFrameworkSrcName(file) 为通过cocoapods下载安装获取图片路径的宏
    之后修改代码中设置图片的方式如下:
    UIImage *img = [UIImage imageNamed:WMCommonSrcName(@"image.png")]?:[UIImage imageNamed:WMCommonFrameworkSrcName(@"image.png")];
    

    参照

    使用Cocoapods创建私有pod spec
    iOS CocoaPods 私有库 steps and tips
    CocoaPods 详解之——更新篇
    iOS移动端架构的那些事

    相关文章

      网友评论

      • 愚人船ios:$ pod repo push WMCommon WPCommon.podsepc 这句命令是在哪个路径下面执行的啊?我新建的窗口输入 找不到相应的的。podspec文件
        犯傻小二:@愚人船ios 这个同样会有这个文件的,看一下文件目录,本地开发校验完成可以提交到远程服务器
        愚人船ios:@犯傻小二 我是用的pod lib create 创建的
        犯傻小二:@愚人船ios 创建私有库的时候,需要创建.podspec文件的.
      • 简书lu:_contenView = [[[NSBundle bundleForClass:[LBChooseContentView class]] loadNibNamed:NSStringFromClass([LBChooseContentView class]) owner:nil options:nil] lastObject ]; 加载XIB 还是会Crash,你把XIB转换为NIB文件了吗
        犯傻小二:@简书lu 我专门测试了一下,使用`[[[NSBundle bundleForClass:[MemberCell class]]
        loadNibNamed:NSStringFromClass([MemberCell class])
        owner:self options:nil] lastObject];` 这种方式加载不会出现问题
        在私有库的资源文件里面文件的格式还是.xib 你看一下,你的私有pod工程有没有这个xib文件

      本文标题:Cocoapods 创建私有库实现项目模块化管理

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