创建公共/私有pod --podspec

作者: Ashen_ | 来源:发表于2016-01-06 22:16 被阅读5678次

    定义

    私有pod: 个人理解,通过公司的服务器作为代码仓库保存的pod,除被分配了相应权限的人(一般为公司内部员工)外的其它人无法访问该pod. 在组件化开发中,以私有的pod作为组件.

    公共pod:公开的pod,例如常用的github中的支持pod的库,能够被任何人访问.


    基本步骤

    1.在自己的服务器创建代码仓库, 地址可能长这样:ssh://git@192.168.250.150/HHCoreFrawmework.git;

    2.本地clone一份,写代码..............;

    3.创建并编辑podspec文件(描述当前代码仓库的信息), 参数设置看下面详情;

    4.打tag(指定版本号), 主要用于版本控制(必须与podspec中版本一致),   git tag -m "1.0.1" 1.0.0 ;

    5. trunk push(私有pod时请跳过此步骤),  pod trunk push yourProj.podspec  ;

    6.在Podfile中使用  pod ‘podName’ , :git => "ssh://git@192.168.250.150/HHCoreFrawmework.git”, :tag => ‘0.0.5’  (公共pod不需要指定git地址,只需要名称即可);


    1.创建podspec文件

    该文件用于描述当前代码仓库的具体信息:name,version,sourceFile等.

    pod spec create podName

    编写podspec文件

    Pod::Spec.new do |s|
      s.name        = "podName"  #名字
      s.version      = "0.1.0"  #版本号
      s.summary      = "Custom Category" #简短的介绍
      s.homepage    = "https://github.com/515783034/podName"  #主页,这里要填写可以访问到的地址,不然验证不通过
      s.license      = "MIT"  #开源协议
      s.author            = { "shmily" => "shijian@hh-medic.com" }  #作者信息
    s.platform    = :ios, "10.0"    #支持平台及版本
      s.source      = { :git => "ssh://github.com/515783034/podName.git", :tag => s.version }
    s.source_files  = "podName/**/*" #代码源文件地址,**/*表示podName目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置(注意: 这个是物理路径,不是Xcode的项目里的路径)
    s.requires_arc = true  #项目是否使用 ARC
    s.resources = "resource/**/*"  #资源文件(*.xib,*.png, bundle等)
    s.dependency "JSONKit", "~> 1.4"  #当前依赖库,pod install时会自动下载该库(注意:没有=)
    end

    注意: 1. s.version应和tag的版本一致.先push该文件之后,再push --tags

    2. 将源代码放置在固定的文件夹下,同时修改s.source_files

    2.push修改后的文件

    注意:一定要上传podspec文件

    git add .
    git commit -m ""
    git pull
    git push

    3.打Tag(这个很重要)

    git tag -m "注释" 0.0.2
    git push --tags

    4.修改Podfile文件

     pod ‘podName’ , :git => "ssh://git@123.57.250.150/pacssvr.test.git”, :tag => ‘0.0.5’
     #    s.name             source                                              version

    5.添加资源文件

    1.添加xib

    在pod中,xib不能当成源文件(即s.source_files),否则pod install之后会报错"Unable to run command 'StripNIB xxx.nib' - this target might include its own product".所以必须要将xib放入资源文件中(即s.resources)

    使用此方式后,虽然可以在不改变原xib任何代码的情况下直接使用,但是需要将xib中使用到的图片文件拷贝到当前项目的Assets.xcassets中

    2.添加图片

    方式1:类似于xib,不需其它操作,将用到图片添加到当前项目Assets.xcassets中;

    方式2:将图片放入s.Resource(或者s.resource_bundles)中

    6.添加.a或.framework库

    某些情况下, 当前pod需要导入第三方库, 比如libWeChatSDK.a, AlipaySDK.framework. 配置方法如下

    1.podspec连接配置

    s.xcconfig  =  {'OTHER_LDFLAGS' => '-ObjC' }

    s.vendored_libraries = 'HHPay/Sources/WechatPay/SDK/libWeChatSDK.a'

    s.framework =  "AlipaySDK"

    s.vendored_frameworks = 'HHPay/Sources/Alipay/AlipaySDK.framework'

    2. 链接系统框架

    // libWeChatSDK.a需要依赖其他系统库

    s.framework = "PassKit", "SystemConfiguration", "CoreTelephony", "Security", "CoreMotion"

    创建非私有pod

    在github上造了一个轮子,希望别人可以通过pod引用你的轮子,那么你就要建一个非私有的pod(可以被公开访问)

    1.前三步和创建私有pod相同

    2.使用trunk 

        A.如果是第一次使用,需要注册*

         pod trunk register yourmail@gmail.com 'yourName' 

       B.检查是否注册成功*

        pod trunk me

      C. 验证podspec文件是否有误

       pod lib lint

     D.push pod spec文件

      pod trunk push yourProj.podspec

    如果在创建的过程中遇到问题, 可是查看我之前遇到的一些问题总结.

    创建私有仓库中踩过的坑

    推荐袁峥Seemygo 的文章教你从0到1如何实现组件化架构,写的很详细。

    相关文章

      网友评论

      • ShenYj:请教一个问题, 我这打算做framework静态库给其他公司用, 为了不公开代码, 先通过SDK开发, 并且架构合并已经开发出了framwork包, 然后另起项目cocoapods托管这个静态库, 因为这个新项目没有任何有用代码, 只有一个framwork包文件, 也要按照"6.添加.a或.framework库"的位置来设置么, 可是总是报错找不到文件
      • DDDDeveloper:- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.总是报这个错误,但是路径检查了一下也是对的。这是因为什么?
        Ashen_:路径写错了,相对路径是相对pospec所在文件夹而言的。通配符看是不是有问题
      • 低吟浅唱1990:还有我也遇到pod lib lint 通过 远程验证不通过的情况 报错是 did not match any file
      • 低吟浅唱1990:libWeChatSDK.a 第三方库中有.a 文件的 是在 spec文件用 用 dependency 导入吗。 还是下载好这些文件 拉到 Classes 文件夹中的。
        Ashen_:不用dependency。通过s.vendored_libraries设置.a
      • 你抓不住我:石神 我今天刚好用到这个,总结的很不错,不错不错!
        Ashen_:亮哥不打赏一点儿?
      • a6b95701a98f:请教一下,我的公有库创建成功后,在工程中把自己写的一对.h.m类文件替换掉原来的ReplaceMe.m文件,并执行了pod update,然后我再另一个demo上pod了这个公有库,可是install后发现pod工程中只有一个ReplaceMe.m文件,我自己创建的类文件不见了,不知道这种情况要怎么做?
        Ashen_:你修改一下version就ok了
      • B_C_H:大神,我照着做,然后用pod search xxx成功了,但是到其他电脑上不能搜索到,这是什么原因?
        Ashen_:@Coder_Bai 不能搜索有可能别人的电脑没有更新仓库. 试试这个命令 pod repo remove master
      • aff99d7a6dd7:大神 能否加下QQ 私聊下 有些问题请教 新手
      • im小码哥:- ERROR | spec: The specification defined in `MyPodDemo.podspec` could not be loaded. 你们这个问题怎么解决。
        Ashen_:@LeeCoco podspec看一下
        84f7637a4e26:我也碰到这个问题了,请教:pray:
        Ashen_:@iamxiaokang 贴下podspec看一下吧, 我没有遇到过这个错误
      • 圣僧留步:[!] Invalid `BlockTrigger.podspec` file: syntax error, unexpected tIDENTIFIER, expecting '}'
        s.source_files = "BlockTrigge...
        ^. Updating CocoaPods might fix the issue.
        我这边一来就报了这样的错误,之前也是报了各种各样的错误,就没成功过。不知道这个错误是怎么回事,它报错的地方我看了感觉配置是正确的啊。就是他文件夹下的文件呗
        Ashen_:@帅到不能自拔 语法错误,你把你BlockTrigger.podspec贴出来看看吧
      • ea37bcb98761:请问 ERROR | [iOS] file patterns: The `source_files` pattern did not match any file. 这个错误你是怎么解决的? s.source_files = "test/test/*.{h,m}" 这个已经是模糊匹配了 结果还是不行
        b96acac40a08:@石_阿神 你好,我的也是这个错误,不过我的是pod spec lint出现这种错误,但是pod lib lint是pass validation
        ea37bcb98761:好的,谢谢
        Ashen_:@我要喝酸奶了 确认下路径是否正确,如果确保路径没问题的话,建议更改为"test/test/*.*"再试试,应该就没问题了
      • will666:石神你好,请教个问题,在静态库里读取图片是直接读取这样[UIImage imageNamed:@"test.png"],还是去bundle里面读取:
        NSString *main_images_dir_path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Test.bundle"];
        NSString *imagePath = [main_images_dir_path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.png",imageName]]
        这样?非常感谢。
        Ashen_:@will666 我的写法是这样的,这个 [HHPHAssetManager class] 是你静态库中任意的一个类,你试试
        + (NSBundle *)getBundle
        {
        NSBundle *aBundle = [NSBundle bundleForClass:[HHPHAssetManager class]];
        NSURL *aURL = [aBundle URLForResource:@"xxx" withExtension:@"bundle"];
        return [NSBundle bundleWithURL:aURL];
        }

        + (UIImage *)getImage:(NSString *)imgName
        {
        return [UIImage imageWithContentsOfFile:[[HHCameraUtil getBundle] pathForResource:imgName ofType:@"png"]];
        }
      • ___as7:我忽然想起了 犯罪嫌疑人x的献身 中的石神 不管怎么说 作者的文章很赞..已经关注
        Ashen_:@___as7 哈哈共同进步吧,我不犯罪的
      • RYC:这个是cocoaPods 必须是最新版本的额吗0.39 的不行是吧?搞了一天都不行
        Ashen_:@RYC 我这篇文章主要就是针对私有库的,你可以再仔细看看。如果有不明白的,咱们再沟通
        RYC:@石_阿神 好了,已经可以了,请问下,如果是公司的私有库,该怎么做是不是和自己git上面开源的做法一样,创建podspec 文件,上传?
        Ashen_:@RYC 不需要最新版本,我的就是0.39啊.不行的原因是什么?到哪一步了?可以贴出来大家一起参考下
      • Ashen_:试试verbose参数吧,看看具体是哪里的问题?
        pod trunk push SJFormatTextField.podspec --verbose
        这个会有详细的错误说明的,修改下就好了.
      • 登杰:我的podspec 都验证通过了 提交的时候还是报 [!] The podspec does not validate.
        求大神 指点 我搞十多个小时 还是没搞定
        Ashen_:@倒影里浅笑 你试试--verbose参数,看看具体错误信息
        倒影里浅笑:@登杰 你好,请问你的问题解决了吗?我本地验证也是通过了,但是提交时验证不通过。请大神解惑 :pray:
        Ashen_:@登杰 试试verbose参数吧,看看具体是哪里的问题?
        pod trunk push SJFormatTextField.podspec --verbose
        这个会有详细的错误说明的,修改下就好了.
      • 乡村武装青年:看了你踩过的坑,至少节省了2个小时.谢啦
        Ashen_:@乡村武装青年 有帮助就好:blush::blush::blush:
      • 無漾:ERROR | [iOS] unknown: Encountered an unknown error (can't modify frozen String) during validation.
        pod lib lint 验证pod spec的时候报这个错,请问什么意思啊?
        Ashen_:@無漾 现在的问题还没有解决是吗?
        無漾:我是修改完之后去验证,验证中没修改
        Ashen_:@無漾 应该说是验证的时候不允许修改文件吧?你操作验证的过程中,不要修改文件试试
      • 32335816e3a3:石神 我今天刚好用到这个,总结的很不错,不错不错! :+1:
        Ashen_:@32335816e3a3 ,,,醉了?你是亮哥?

      本文标题:创建公共/私有pod --podspec

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