美文网首页UI
Swift/Objective-C-使用Cocoapods创建/

Swift/Objective-C-使用Cocoapods创建/

作者: sky_storming | 来源:发表于2019-02-22 12:08 被阅读0次

    将自己封装的库上传至Pod的repo存储库。

    1. 需要准备的东西
    • GitHubtrunk账号(后面会提到如何注册)
    • 有的还需要配置和管理.ssh账号
    • 下载Sourcetree管理自己的公共库(需要注册Sourcetree账号),或者通过终端命令进行管理
    2. 在GitHub上创建一个空的仓库
    • 新建Repository,如下图: 选择新建Repository.png
    3. 通过终端命令创建本地工程

    1)打开终端,通过cd 命令进入到目标文件夹下,我这里是进入桌面的PublicRepository文件夹

    $ cd Desktop/PublicRepository/ 
    

    2)通过pod命令查询一下你起的工程名是否已被占用,若已被占用必须重新起名,因为pod要求库名不能重复,否则到最后一步由于工程名被占用,提交通不过,就得重来一遍了。

    $ pod search 工程名
    
    结果如下图: 工程名未在pod中找到.png

    无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod,说明起的工程名在pod中未被占用。

    3)通过pod命令创建模板工程

    $ pod lib create 工程名
    

    注意:执行此命令后,Cocoapods会自动帮我们创建README文件和MIT LICENSE协议文件

    • 命令运行后有些配置项需要配置下,如下图: 创建本地模板工程,及配置信息.png

    填写完成后,将自动创建demo应用程序,并自动运行pod install命令安装下载JYTest0公共库,下载完成后,自动打开demo应用程序。

    • 预览demo工程,工程结构如下图:
      demo工程目录结构.png
    4. 添加公共库文件到Classes文件夹中,资源文件添加到Assets文件夹中
    • 在Xcode打开的demo工程中,选中ReplaceMe.swift文件,右键Show in Finder,打开Classes文件夹,将自己的公共库文件添加到Classes文件夹中,并将无用的ReplaceMe.swift文件删除。目录结构如下图: 封装的公共库文件所在目录.png

    切记:不要直接将公共库文件拖到Xcode打开的demo工程的ReplaceMe.swift文件的位置,这样做可能导致路径错误。

    注意:若你创建的模板工程中没有Assets和Classes这两个文件夹,你可以自己创建这两个文件夹,放到对应的位置,导入公共库文件;或者根据自己喜好创建文件夹,导入公共库文件,以上两种方式创建后都需要再次查看.podspec文件中的s.source_files的配置,确定路径是否对应正确,若不正确则需修改成自己的文件夹及文件路径。

    5. 配置“工程名.podspec”文件中的信息

    1)在Xcode打开的demo工程中,找到Podspec Metadata文件夹下的“工程名.podspec”文件。

    • .podspec文件中配置信息说明:
    Pod::Spec.new do |s|
      s.name             = 'JYTest0'    # 工程的名字(pod search 搜索的关键词,一定要和.podspec的名称一样,否则报错)
      s.version          = '0.1.0'   # 工程的版本控制(默认0.1.0版本),控制公共库的下载,必须和tag的版本保持一致(稍后提到)
      s.summary          = 'A short description of JYTest0.' # 项目的概要(简介),最好修改下,否则pod验证时可能报错
    
    # This description is used to generate tags and improve search results.
    #   * Think: What does it do? Why did you write it? What is the focus?
    #   * Try to keep it short, snappy and to the point.
    #   * Write the description between the DESC delimiters below.
    #   * Finally, don't worry about the indent, CocoaPods strips it!
    
    # 项目的描述,是概要的扩展。注意:这里的结构不可变,只能在TODO那一行增加东西,否则报错(注意s.description 文字书写格式);这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
      s.description      = <<-DESC
    TODO: Add long description of the pod here.
                           DESC
    
      s.homepage         = 'git项目链接(注意不带.git)' # 项目主页地址,GitHub上的公共库地址,注意不带后缀.git(必须为可以链接到的页面)。.podspec文件中的homepage和source不支持ssh协议地址,所以我们得放入http/https地址。
      # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'  # 截屏,屏幕快照的地址,例如演示的 gif 文件
      s.license          = { :type => 'MIT', :file => 'LICENSE' } # 开源协议,模板创建的不用改动
      s.author           = { '用户名' => 'GitHub邮箱地址或其他' } # 作者信息,不用改动
      s.source           = { :git => '完整的git项目链接(带.git)', :tag => s.version.to_s } # 这个很关键,指的就是git的对应的远程仓库的地址以及版本号,版本号直接获取的是上面的s.version(带.git,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS),tag是公共库的版本号
      # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' # 多媒体介绍地址
    
      s.ios.deployment_target = '8.0' # 支持的平台及最低依赖版本
      # s.platform     = :ios, '8.0' # 支持的平台及版本
      s.requires_arc = true # 是否使用ARC,如果指定具体文件,则具体的问题使用ARC
    
      # s.exclude_files = '' # 隐藏的文件
    
      s.source_files = 'JYTest0/Classes/**/*' # 为代码库源文件路径(你库文件存放的目录位置),**/*表示Classes目录及其子目录下所有文件,“**” 表示匹配所有子目录,“*”是通配符,“.{h,m}” 表示匹配所有以.h和.m结尾的文件,“” 表示匹配所有文件,如果有多个目录下则用逗号分开。如果你准备pod的工程只是.h、.m以及一些图片资源的话,s.source_files = 'Classes/**/*.{h,m}'等,保证Classes 下的所有子文件中的.h、.m都能加载。打包公共库需要的文件路径都在这里配置,稍后详细配置。
      # 设置子目录,如果需要在项目中分组显示,这里也要做相应的设置(因为我们封装的一段代码,可能是由好几段之间没有联系的代码拼起来的。而有的时候,我们只想用我们封装的代码的某一段或者某几段)
      s.subspec 'Test1' do |test|
        test.source_files = 'JYTest0/Classes/Test1/**/*'
        test.dependency 'AFNetworking', '~> 3.0'
        test.dependency 'SDWebImage', '~>2.0'
      end
    
    
      s.vendored_frameworks = 'Classes/xxx.framework'  # 包含的framework,也就是我们自己制作的pod
    
      # s.resource_bundles = { # .bundle、.png文件等资源文件路径
      # 这里存放的 bundle 文件的例如, '工程名称' => ['工程名称/Assets/*.png']  # 这里放的 png 图片的资源文件,如果还想使用  storyboard,xib,imageset 文件的话,可以如下面的方法写
      # '工程名称' => ['工程名称/Assets/*.{png,xib,storyboard,imageset}']
      # 如果我们使用 xib , storyboard , 图片等资源的时候文件必须强制性放到 Assets 文件夹下,这个文件夹在初始化的时候,并没有显示在工程中,不过可以通过 show in Finder classes 文件查看,发现里面有一个同级别的文件夹 Assets , 我们把我们创建的资源文件拖入到这个文件夹下,然后重新在终端中输入命令行: cd .../Example,然后pod install 再次查看会发现 Assets 文件夹与 classes 同时存在  
      #   'Test' => ['Test/Assets/*.png']
      # }
      # s.resource = ''  # 资源文件,单个
      # s.resources = '', '' # 资源文件,多个(含bundle)
    
      # s.public_header_files = 'Pod/Classes/**/*.h' # 公开头文件地址
      # s.frameworks = 'UIKit', 'MapKit' # 所需依赖的系统库文件,只能是系统库,多个用逗号隔开,如:s.frameworks = 'AVFoundation', 'CoreMotion', 'CoreMedia'
      # s.dependency 'AFNetworking', '~> 2.3' # 公共库中引入的其他依赖库,当在加载的时候也会一块把相关的依赖的库加载下来。注意:必须指定依赖库的版本,否则验证时会报错。每次只能引入一个依赖库,如果需要多个依赖库依次往下写即可,如:s.dependency 'AFNetworking',不能依赖未发布的库。
      # s.dependency 'SDWebImage' # 如果需要多个依赖库依次往下写即可
    

    更多属性请参考Cocoapods-Podspec

    • 了解了.podspec文件中各种配置的作用,然后修改配置信息,主要需要修改的内容如下:
    s.version          = '0.0.1'
    s.summary          = '这是一个测试公共库!'
    s.homepage         = 'https://github.com/JYanshao/JYTest0'
    s.source           = { :git => 'https://github.com/JYanshao/JYTest0.git', :tag => s.version.to_s }
    s.ios.deployment_target = '8.0'
    s.source_files = 'JYTest0/Classes/**/*'
    s.source_files = 'JYTest0/Classes/**/*.{h,m}' # 多个文件路径
    s.dependency 依赖的第三方库
    s.dependency 多个依赖的第三方库
    

    注意:.podspec文件的结构是相对于公共库文件夹的

    2)项目包含未发布至pod的第三方SDK、.a文件等的配置
    s.vendored_libraries中加入依赖的和自己要发布的.a文件
    s.vendored_libraries = 'Classes/xxxSDK.a','Classes/xxxV2.2.1.a'
    s.vendored_frameworks中加入依赖的和自己要发布的.framework文件:
    s.vendored_frameworks = 'Classes/xxx.framework', 'Classes/myself.framework'
    .a库的特殊处理,因为s.vendored_libraries中引入的.a文件并不包含.a需要暴露出来的文件,所以需要在s.source_files中把要暴露的文件引用,注意相对目录,有图片资源的话处理方式相同

    要发布至pod的自己的.a或者.framework其实和依赖的未发布至pod的三方库处理方式相同

    3)配置修改完成后,cd 到Example文件夹下(即demo工程目录下),运行命令:

    $ pod install
    

    更新demo工程。更新成功后 Command+B 编译demo工程看有没有错误,若有错误及时修改,若错误未修改,则在之后的验证中会报错,通不过验证。
    在demo工程中引入公共库(import JYTest0)测试是否可用,可以使用则说明没有问题。

    6. 通过命令验证本地的.podspec文件

    ⚠️注意:在步骤操作之前,必须确保在GitHub上已经创建了对应的公共库

    cd 到.podspec 所在的目录,运行以下命令进行验证:

    $ pod lib lint JYTest0.podspec 或者直接 $ pod lib lint
    
    验证过程中,发现出错了,是由于一个WARN导致的,错误如下图: 验证.podspec文件WARN错误1.png

    仔细阅读这条警告,大致意思是:你没有指定使用的swift版本,验证器默认使用的是swift 3.2,可能会出现问题,希望你在验证期间指定Swift版本,请在podspec中添加“swift_version”属性。注意“--swift-version”参数或创建.swift-version隐藏文件的用法现在被弃用。

    • 解决方案1(推荐):警告中给出的解决方案,在.podspec 配置文件中添加“swift_version”属性( 这里的4.0是根据你使用的版本来指定的,不一定是4.0),完整的配置如下:
    s.swift_version = '4.0'
    

    然后再运行验证命令即可 。

    • 解决方案2(提示中说是被弃用了,但可以解决警告):在终端里cd 到你公共库.podspec文件目录下,创建.swift-version隐藏文件并指定swift版本号,运行以下命令:
    $ echo "4.0" > .swift-version
    

    然后再运行验证命令即可 。

    • 解决方案3(未试):如上图,在末尾也给出了其他解决的办法,就是在命令的后边加上“--allow-warnings”命令(即忽略警告),再运行即可解决。

    • 解决方案4(未试,提示中说是被弃用了,知道一下即可):在验证.podspec配置文件的命令后边指定swift版本,命令如下:

    pod spec lint JYTest0.podspec --swift-version=4.0 –verbose
    

    请注意: s.swift_version = '4.0' 和 echo "4.0" > .swift-version,这两个解决方案不要同时做 原因请看这篇文章

    • 我采用的是前两种方式解决了问题,验证.podspec文件成功,如下图: 添加swift_version属性,验证.podspec配置文件成功.png
    终端运行“echo "4.0" > .swift-version”命令,验证.podspec配置文件成功.png
    • 终端cd 到demo工程目录,运行$ pod install命令,更新demo工程的公共库和.podspec配置文件。
    其他错误:由于导入公共库文件后,没有编译demo工程,不知道公共库文件中存在错误,导致验证失败,如下图: 导入的文件错误,导致验证失败.png

    按照提示把错误的地方修改好,然后编译demo工程没有错误,再次验证即可。如果更改正确后,还出现这个错误,可尝试新建一个新的tag,然后再验证。

    7. 将本地的模板工程提交到GitHub的空仓库

    运行以下命令:

    $ git add .
    $ git commit -m '提交的描述'
    $ git remote add origin git地址
    $ git push -u origin master
    
    提交公共库到GitHub上的空仓路1.png 提交公共库到GitHub上的空仓路2.png
    • 为GitHub上的公共库添加tag,命令如下:
    $ git tag 0.0.1
    $ git push --tag 
    
    为公共库指定tag.png
    注意:tag的版本必须和.podspec配置文件中的s.version = '0.0.1'的版本保持一致。
    8. 通过命令验证GitHub上公共库的.podspec文件

    注意:在此步骤操作之前,必须确保已经把本地的模板工程已经提交到GitHub上的空仓库了

    • cd 到.podspec 所在的目录,运行以下命令进行验证:
    $ pod spec lint JYTest0.podspec 或者直接 $ pod spec lint
    

    ⚠️注意:该验证必须确定已经把本地工程提交到GitHub的空仓库了。否则会报如下错误:

    未提交本地工程到git仓库,执行spec验证,报错.png
    • 提交工程到GitHub上,再验证,验证成功,如下图: 验证.podspec配置文件成功.png
    • 验证过程中遇到的错误:
      错误1:报[!] Unable to find a spec namedJYTest0.podspec'.`错误,说明你所在的目录非.podspec配置文件的目录。

    错误2:如下图:

    spec验证问题2.png 该问题是由于我的.podspec配置文件中有一个不符合要求,需要进行修改,即s.source_files = 'JYTest0/Classes/**/*'路径配置错误导致的,修改路径为s.source_files = 'JYTest0/Classes/*.swift',然后提交到GitHub的公共库,再运行验证命令即可。如果更改为正确路径后,还出现这个错误,可尝试新建一个新的tag,然后再验证。
    9. 提交pod 到Specs仓库(提交.podspec文件至pod库)
    • 以上步骤都正确后,可以进行pod库的提交,运行如下命令:
    $ pod trunk push Test.podspec
    
    • 提交成功,如下图: 提交pod到Specs仓库成功.png
    • 提交过程中可能遇到的问题:
      问题1:报[!] The specified pathTest.podspecdoes not point to an existing podspec file.错误,说明你所在的目录非.podspec配置文件的目录。

    问题2:如下图:

    需要先注册个pod账号问题.png 这个由于我们之前没有pod账号,所以提交的时候提示你,让你先注册个trunk账号。
    运行以下命令注册trunk账号(参见trunk命令):
    $ pod trunk register 你的邮箱 用户名 --description='描述内容' (描述可省略)
    
    注册pod账号.png

    邮箱验证成功后,运行一下命令:

    $ pod trunk me
    

    确定注册的信息是否通过验证。验证通过输出信息如下:

    • Name: 名称
    • Email: 邮箱(GitHub账号)
    • Since: August 2nd, 2018 19:27
    • Pods:
    • Test0
    • JYTest0
    • Sessions:
    问题3:已存在重名的公共库问题,如下图: 提交pod到Specs,报名字已被占用的提示.png

    这个错误貌似只能重新走一遍流程了。

    问题4:如下图: 更新本地repo.png

    由于本地的master的repo还没有我们的公共库,所以需要先更新一下,再提交。更新命令如下:

    $ pod repo update --verbose
    
    10. 通过pod命令搜索自己制作的公共库
    • 运行一下命令,搜索自己制作的公共库
    $ pod search JYTest0 (不区分大小写)
    
    运行命令后,却没有搜索到我的公共库,提示信息如下图: 搜索不到公共库,提示信息.png

    提示信息表明:[!]无法找到名称、作者、摘要或描述与“JYTest0”匹配的pod。

    对于有些类库确实是在Cocoapods中所不存在的,为了确定我们搜索的库是不是真的在Cocoapods的Repos中存在,我们可以到https://cocoapods.org/中进行搜索。

    • 解决方案1:
      1)在终端运行pod setup命令,运行结果如下图所示,说明执行成功: 运行pod setup命令结果.png 再次进行搜索操作,但结果还是找不到我的公共库,还是提示:[!] Unable to find a pod with name, author, summary, or description matching JYTest0

    2)可能是由于pods库没更新导致的,那么需要运行$ pod repo update --verbose命令更新下本地的repo,然后后再次进行搜索操作,但结果还是找不到我的公共库,还是那个提示,那就继续探索吧。

    • 解决方案2:pod setup成功后,会在/Library/Caches/CocoaPods/目录下生成一个search_index.json文件,那么删除这个文件试试,前往/Library/Caches/CocoaPods/文件夹删除search_index.json文件,或者通过rm命令:$ rm ~/Library/Caches/CocoaPods/search_index.json,删除成功后,再次运行搜索pod库命令,就可以搜索到公共库了。
    搜索结果: 搜索结果.png





    参考文章:

    iOS SDK制作上传Pods的repo公共库管理包含.framework和.a,.png文件等
    iOS 使用Cocoapods创建/管理自己的公共库傻瓜教学
    cocoapods 创建公开公共库
    验证.podspec文件时关于swift version的警告问题
    pod 私有库 swift_version问题
    在github上传项目遇到的问题(error: failed to push some refs to 'https://github.com/CrazyDony/text.git')
    [Cocoapods]项目添加Cocoapods支持遇到的坑
    Cocoapods: pod search无法搜索到类库的解决办法

    相关文章

      网友评论

        本文标题:Swift/Objective-C-使用Cocoapods创建/

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