基础-podSpec使用

3.podspec文件讲解

podspec是一个描述pod库版本文件。

一、 Specification

它包含源文件在哪里查找,要使用的文件,要应用的构建设置,以及常见元素名称、版本和说明
一个标准的podspec文件可以通过 $ pod spec create 命令生成

  1. 简例:
     Pod::Spec.new do |spec|
         spec.name         = 'Reachability'
         spec.version      = '3.1.0'
         spec.license      = { :type => 'BSD' }
         spec.homepage     = 'https://github.com/tonymillion/Reachability'
         spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' }
         spec.summary      = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
         spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
         spec.source_files = 'Reachability.{h,m}'
         spec.framework    = 'SystemConfiguration'
     end
    
  2. 详细例子:
     Pod::Spec.new do |spec|
         spec.name          = 'Reachability'
         spec.version       = '3.1.0'
         spec.license       = { :type => 'BSD' }
         spec.homepage      = 'https://github.com/tonymillion/Reachability'
         spec.authors       = { 'Tony Million' => 'tonymillion@gmail.com' }
         spec.summary       = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
         spec.source        = { :git => 'https://github.com/tonymillion/Reachability.git', :t            ag => 'v3.1.0’ }    
         spec.module_name   = 'Rich'
         spec.swift_version = '4.0'
         spec.ios.deployment_target  = '9.0'
         spec.osx.deployment_target  = '10.10'
         spec.source_files       = 'Reachability/common/*.swift'
         spec.ios.source_files   = 'Reachability/ios/*.swift', 'Reachability/extensions/*.swift'
         spec.osx.source_files   = 'Reachability/osx/*.swift'
         spec.framework      = 'SystemConfiguration'
         spec.ios.framework  = 'UIKit'
         spec.osx.framework  = 'AppKit'
         spec.dependency 'SomeOtherPod'
     end
    

二、 描述库的特定版本信息

Pod::Spec.new do |spec|
    //库名称
    spec.name          = ‘Reachability’

    //库版本号,这也是我们podfile文件指定的版本号。 每次发布版本都需要打tag标签(名称就是版本号)
    spec.version       = ‘3.1.0'

    //许可证,除非源代码包含了LICENSE.*或者LICENCE.*文件,否则必须指定许可证文件。文件扩展名可以没有,或者是.txt,.md,.markdown
    spec.license       = { :type => 'BSD’ }
    or spec.license = ‘MIT'
    or spec.license = { :type => 'MIT', :file => 'MIT-LICENSE.txt’ }
    or spec.license = { :type => 'MIT', :text => <<-LICENSE
                        Copyright 2012
                         Permission is granted to...
                         LICENSE
                      }

    //pod主页
    spec.homepage      = 'https://github.com/tonymillion/Reachability’      

    //pod库维护者的名车和邮箱
    spec.authors       = { 'Tony Million' => 'tonymillion@gmail.com’ } 
    or spec.author = 'Darth Vader'
    or spec.authors = 'Darth Vader', 'Wookiee'
    or spec.authors = { 'Darth Vader' => 'darthvader@darkside.com',
                    'Wookiee'     => 'wookiee@aggrrttaaggrrt.com' }     

    //指定多媒体地址,如果是推特发布版本会有通知
    spec.social_media_url = 'https: //twitter.com/cocoapods 
    or spec.social_media_url = 'https: //groups.google.com/forum/#!forum/cocoapods'
    
    //pod简介
    spec.summary = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
        
    //详细描述
    spec.description = <<-DESC                     Computes the meaning of life.
                 Features:
                 1. Is self aware
                 ...
                 42. Likes candies.
               DESC
    
    //获取库的地址
    a. Git:git地址,tag:值以v开头,支持子模块
        spec.source        = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0’ }
        spec.source = { :git => 'https://github.com/typhoon-framework/Typhoon.git',
                :tag => "v#{spec.version}", :submodules => true }
    b. Svn:svn地址
        spec.source = { :svn => 'http://svn.code.sf.net/p/polyclipping/code', :tag => ‘4.8.8‘ }
    c. Hg:Mercurial
        spec.source = { :hg => 'https://bitbucket.org/dcutting/hyperbek', :revision => "#{s.version}" }
    
    // Pod 屏幕截图,支持单个或者数组,主要适用于UI类的pod库。cocoapods推荐使用gif
    spec.screenshot  = 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png'
    or spec.screenshots = [ 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png',
                            'http://dl.dropbox.com/u/378729/MBProgressHUD/2.png' ]
    
    // 说明文档地址
    spec.documentation_url  =  'http://www.example.com/docs.html’
    
    // pod下载完成之后,执行的命令。可以创建,删除,修改任何下载的文件。该命令在pod清理之前和pod创建之前执行。
    spec.prepare_command = 'ruby build_files.rb'
    or spec.prepare_command = <<-CMD                        sed -i 's/MyNameSpacedHeader/Header/g' ./**/*.h
                    sed -i 's/MyNameOtherSpacedHeader/OtherHeader/g' ./**/*.h
             CMD
            
    //module name
    spec.module_name   = ‘Rich'
    //支持的swift版本
    spec.swift_version = ‘4.0'
    // 支持的Cocoapods版本
    spec.cocoapods_version = ‘>=0.36’
    
    // 是否使用静态库。如果podfile指明了use_frameworks!命令,但是pod仓库需要使用静态库则需要设置
    spec.static_framework = true
    
    // 库是否废弃
    spec.deprecated = true

    //  废弃的pod名称
    spec.deprecated_in_favor_of = 'NewMoreAwesomePod'

    // pod支持的平台,如果没有设置意味着支持所有平台,使用deployment_target支持选择多个平台
    spec.platform = :osx,  ’10.8'
    or spec.platform = :ios
    or spec.platform = :osx         
            
    // 可以指定多个不同平台
    spec.ios.deployment_target =  ‘6.0'
    or .osx.deployment_target = '10.8'

三、 配置 pod库 工程环境变量

  1. dependency: 私有库依赖的三方库
     spec.dependency 'AFNetworking', '~> 1.0'
    
  2. requires_arc: 指定私有库 文件是否 是ARC.默认是true,表示所有的 source_files是arc文件
     spec.requires_arc = true
     //指定除了Arc文件下的是arc,其余的全还mrc,会添加-fno-objc-arc 编辑标记
     spec.requires_arc = false       spec.requires_arc = 'Classes/Arc'
     spec.requires_arc = ['Classes/*ARC.m', 'Classes/ARC.mm']
    

    注意:spec.requires_arc 指定的路径表示是arc文件,不被指定才会被标记 -fno-objc-arc

  3. frameworks: pod库使用的系统库
     spec.ios.framework = 'CFNetwork'
     spec.frameworks = 'QuartzCore', 'CoreData'
    
  4. weak_frameworks: 如果在高版本的OS中调用新增的功能,还要保持低版本OS能够运行,就要使用weak_framwoks如果引用的某些类或者接口在低版本中并不支持,可以再运行时判断。
     spec.weak_framework = 'Twitter'     
    
  5. libraries使用的静态库 比如libz,sqlite3.0等,多个用逗号分开
     spec.ios.library = ‘xml2'
     spec.libraries = 'xml2', 'z'
    
  6. compiler_flags: 传递个编译器的标记列表
     spec.compiler_flags = '-DOS_OBJECT_USE_OBJC = 0' , '-Wno-format'
    
  7. pod_target_xcconfig: flag添加到私有库的target Xcconfig文件中,只会配置当前私有库
     //user_target_xcconfig  会影响所有target的 Xcconfig,他会污染用户配置,所以不推荐使用,可能会导致冲突
     spec.pod_target_xcconfig  =  {  'OTHER_LDFLAGS'  =>  '-lObjC'  }
     spec.user_target_xcconfig  =  {  'MY_SUBSPEC'  =>  'YES'  }
    

    注意:尽量使用pod_target_xcconfig,只会影响你编译的pod

  8. prefix_header_file: 默认是true cocoapos会生成默认前缀.pch文件
     //自定义前缀文件
     spec.prefix_header_file = false
     spec.prefix_header_file = 'iphone/include/prefix.pch'
    
  9. prefix_header_contents 向pod项目的前缀文件中添加内容
     spec.prefix_header_contents  =  '#import <UIKit / UIKit.h>'
     spec.prefix_header_contents  =  '#import <UIKit / UIKit.h>' , '#import <Foundation / Foundat            ion.h>'
    
  10. module_name
  11. header_dir
  12. header_mappings_dir

四、文件操作 :podspec文件必须在根仓库文件中。文件路径也是相对于根仓库位置的

  • 模式1:*(检测文件名)
    * 匹配所有文件
    c* 匹配以c开头的文件
    *c 匹配以c结尾的文件
    c 匹配以包括c的文件

  • 模式2:**
    递归匹配目录

  • 模式3:?
    匹配任何一个字符

  • 模式4:[set]
    匹配任何在set中的字符

  • 模式5:{p, q}
    匹配p,或q

  • 模式6:遗弃下一个元字符
    "JSONKit.?" #=> ["JSONKit.h", "JSONKit.m"]
    ".[a-z][a-z]" #=> ["CHANGELOG.md", "README.md"]
    "
    .[^m]" #=> ["JSONKit.h"]
    "
    .{h,m}" #=> ["JSONKit.h", "JSONKit.m"]
    "*" #=> ["CHANGELOG.md", "JSONKit.h", "JSONKit.m", "README.md"]
  1. source_files:pod文件路径
     spec.source_files = 'Classes/**/*.{h,m}’
     spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
    
  2. public_header_files:公共头文件,这些头文件将暴露给用户的项目。如果不设置,所有source_files的头文件将被暴露
         spec.public_header_files  =  'Headers / Public / *.h'
    
  3. private_header_files.和public_header_files相反,指定不暴露的头文件
  4. vendored_frameworks:使用的三方framework
     spec.ios.vendored_frameworks = 'MyPod/Frameworks/MyFramework.framework’ //指定三方库的路径
     spec.vendored_frameworks = 'MyFramework.framework', ‘TheirFramework.framework'
    
  5. vendored_libraries:三方静态库 指明具体路径
     spec.ios.vendored_library = 'Libraries/libProj4.a’
     spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
    
  6. resource_bundles:资源文件
     s.ios.resource_bundle = { 'MapBox' => 'MapView/Map/Resources/*.png' }
     s.resource_bundles = {   'XBPodSDK' => ['XBPodSDK/Assets/**']}
    
  7. exclude_files:被排除的文件
     spec.ios.exclude_files = 'Classes/osx’
     spec.exclude_files = 'Classes/**/unused.{h,m}'
    

五、Subspecs 私有库模块

  1. subspec:
    //简单:
    subspec 'Twitter' do |sp|
        sp.source_files = 'Classes/Twitter' //指定子模块路径
    end
    subspec 'Pinboard' do |sp|
        sp.source_files = 'Classes/Pinboard'
    end
    
    //复杂:
    Pod::Spec.new do |s|
        s.name = 'RestKit'

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

推荐阅读更多精彩内容