CocoaPod使用--Podspec--制作Pod库

文章目录

  • 制作Pod库
    • 私有Pod库制作
    • 公有Pod库制作(略)
  • Podspec 语法
    • 一个简单的Podspec文件
    • 创建一个Pod库的说明规范(Specification)
      • 多平台
      • 必需规范
        • 定义库名字
        • 定义库版本号
        • 定义作者信息
          • 单个作者
          • 多个作者
          • 作者邮箱
        • 许可协议
        • 主页
        • Pod库地址
        • 简介
      • 可选规范
        • 详细介绍
        • 支持的swift版本
        • 支持的CocoaPod版本
        • 社交媒体地址
        • 截图
          • 单张图片
          • 多张图片
        • 文档地址
        • 前置脚本
        • 添加xcodebuild脚本 script_phases
        • 静态库框架 static_framework
        • 指定支持的平台
          • 指定支持单个平台
          • 指定支持多个平台
        • 指定依赖他方Pod库
        • 启用或关闭ARC
          • 所有文件启用或关闭ARC
          • 部分文件启用ARC
        • 系统库依赖(苹果的库)
        • weak link 弱链接
        • 设定编译标志
        • 预编译头 (prefix header)
        • 模块名字 (module_name)
      • 库文件规范
        • 文件名匹配通配符
        • 源代码
        • 公开的头文件
        • 私有的头文件
        • 库自身包含framework
        • 库自身包含静态库(.a)
        • 库包含资源文件,并希望打包成bundle
        • 库包含资源文件
        • 排除某些文件
        • 受保护的路径

参考网址 http://guides.cocoapods.org
成文的环境

  • mac os 10.14
  • cocoapod 1.5.3
  • xcode 10.1

制作Pod库

私有Pod库制作

https://mp.csdn.net/mdeditor/86520080#

公有Pod库制作(略)

和私有Pod库制作过程基本一致,区别在于公有库需要发布到CocoaPods
发布使用CocoaPods Trunk方式。

Podspec 语法

一个简单的Podspec文件

# 语法检查 pod lib lint xxx.podspec
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' => '[email protected]' } #作者
  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

创建一个Pod库的说明规范(Specification)

Pod::Spec

Pod::Spec.new do |spec|  # 创建一个Pod::Spec变量,名字spec
  spec.name         = 'Reachability' #库名字
  #其他说明规范
end

多平台

ios
osxmacos
tvos
watchos

必需规范

定义库名字

name 属性

Pod::Spec.new do |spec| 
  spec.name         = '你的库名字' 
end

定义库版本号

version 属性
版本号遵循 semantic versioning

Pod::Spec.new do |spec| 
  spec.version = '1.2.3' #版本号
end

定义作者信息

单个作者

author属性

Pod::Spec.new do |spec| 
  spec.author = '作者名字'
end
多个作者

authors属性

Pod::Spec.new do |spec| 
  spec.authors = '作者名字A','作者名字B','作者名字C'
end
作者邮箱
#一个作者
Pod::Spec.new do |spec| 
  spec.author = { '作者A' ==> '[email protected]'}
end

#多个作者
Pod::Spec.new do |spec| 
  spec.authors = { '作者A' ==> '[email protected]',
  				   '作者B' ==> '[email protected]'
  				}
end

许可协议

license属性
知名的许可协议

Pod::Spec.new do |spec| 
  spec.license = 'MIT'
end

指定许可协议文件

Pod::Spec.new do |spec| 
  spec.license = { :type => 'ABC', :file => 'MIT-LICENSE.txt' }
end

简短的许可协议内容

Pod::Spec.new do |spec| 
  spec.license = { :type => 'MIT', :text => <<-LICENSE
  					#//协议内容//
                   Copyright 2012
                   Permission is granted to...
                    #//
                 LICENSE
               }
end

主页

homepage属性

Pod::Spec.new do |spec| 
  spec.homepage = 'http://www.example.com'
end

Pod库地址

source属性
支持协议 gitsvnhghttp
支持关键字:

:git => :tag, :branch, :commit, :submodules
:svn => :folder, :tag, :revision
:hg => :revision
:http => :flatten, :type, :sha256, :sha1

仓库 + 标签

Pod::Spec.new do |spec| 
  # git
  spec.source = { :git => 'https://xxx.yyy.zzz/abc.git',
  				  :tag => '1.2.3' }# svn
  spec.source = { :svn => 'https://xxx.yyy.zzz/abc',
  				  :tag => '5.6.7' }# hg
  spec.source = { :hg => 'https://xxx.yyy.zzz/abc',
  				  :revision => '8.9.0' }
end

http地址 + 代码压缩包
压缩格式支持 zip, tgz, bz2, txz ,tar

Pod::Spec.new do |spec| 
  spec.source = { :http =>  'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip'}
end

http地址 + 代码压缩包
支持文件Hash校验,支持的Hash算法有sha1 ,sha256

Pod::Spec.new do |spec| 
  spec.source = { :http =>  'http://dev.wechatapp.com/download/sdk/WeChat_SDK_iOS_en.zip' 
  				  :sha1 => '7e21857fe11a511f472cfd7cfa2d979bd7ab7d96'}
end

简介

summary属性 ,最大140个字符

Pod::Spec.new do |spec| 
  spec.summary = '简介'
end

可选规范

详细介绍

description属性,比简介summary更详细的介绍

spec.description = <<-DESC
					#//协议内容// 
                     详细介绍
                     #/ 
                   DESC

支持的swift版本

swift_version属性,指Swift语言版本

Pod::Spec.new do |spec| 
  spec.swift_version = '3.2' #版本号
end

支持的CocoaPod版本

cocoapods_version属性,指支持的CocoaPod工具版本

Pod::Spec.new do |spec| 
  spec.cocoapods_version = '>= 0.36'
end

社交媒体地址

social_media_url属性

Pod::Spec.new do |spec| 
  spec.social_media_url = 'https://twitter.com/cocoapods'
end

截图

一些图片url,支持gif格式

单张图片

screenshot 属性

Pod::Spec.new do |spec| 
  spec.screenshot = 'http://dl.dropbox.com/u/378729/MBProgressHUD/1.png'
end
多张图片

screenshots 属性

Pod::Spec.new do |spec| 
  spec.screenshots = ['http://dl.dropbox.com/u/378729/MBProgressHUD/1.png',
                      'http://dl.dropbox.com/u/378729/MBProgressHUD/2.png' ]
end

文档地址

documentation_url 属性

Pod::Spec.new do |spec| 
  spec.documentation_url = 'http://www.example.com/docs.html'
end

前置脚本

prepare_command 属性
一个bash脚本,在下载Pod库后,Specification(Pod::Spec)的其他属性被收集之前运行。 此命令可用于创建,删除和修改下载的任何文件。

此命令的工作目录是Pod的根目录。
在清除Pod之前和创建Pods项目之前执行此命令。

如果使用了:path选项安装pod,则不会执行此命令。

单条

Pod::Spec.new do |spec| 
    spec.prepare_command = 'ruby build_files.rb' 
end

多条

Pod::Spec.new do |spec| 
    spec.prepare_command = <<-CMD
                        sed -i 's/MyNameSpacedHeader/Header/g' ./**/*.h
                        sed -i 's/MyNameOtherSpacedHeader/OtherHeader/g' ./**/*.h
                   CMD
end

添加xcodebuild脚本 script_phases

和前置脚本prepare_command 不同,script_phases将作为xcodebuild的一部分,可以访问编译期间的所有环境变量

Pod::Spec.new do |spec| 
  spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"' }
  或
  spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"', :execution_position => :before_compile }
  或
  spec.script_phase = { :name => 'Hello World', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby' }
  或
  spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"',
  :input_files => ['/path/to/input_file.txt'], :output_files => ['/path/to/output_file.txt']
}
  或
  spec.script_phase = { :name => 'Hello World', :script => 'echo "Hello World"',
  :input_file_lists => ['/path/to/input_files.xcfilelist'], :output_file_lists => ['/path/to/output_files.xcfilelist']
}
  或
  spec.script_phases = [
    { :name => 'Hello World', :script => 'echo "Hello World"' },
    { :name => 'Hello Ruby World', :script => 'puts "Hello World"', :shell_path => '/usr/bin/ruby' },
  ]}
end

静态库框架 static_framework

static_framework
表示,如果Podfile使用了指令use_frameworks! ,那么pod应包含静态库框架。

Pod::Spec.new do |spec| 
   spec.static_framework = true 
end

指定支持的平台

指定支持单个平台

platform 属性

Pod::Spec.new do |spec| 
   spec.platform = :osx, '10.8'
   或
   spec.platform = :ios
   或
   spec.platform = :tvOS
   或
   spec.platform = :watchos
end
指定支持多个平台

deployment_target

Pod::Spec.new do |spec| 
   spec.ios.deployment_target = '6.0'
   spec.osx.deployment_target = '10.8'
   spec.tvOS.deployment_target = '9.0'
   spec.watchos.deployment_target = '2.0'
end

指定依赖他方Pod库

dependency
可以指定依赖其他Pod库
例如

Pod::Spec.new do |spec| 
   spec.dependency 'AFNetworking', '~> 1.0'
end

版号规则 参见[设置版本号] [https://blog.csdn.net/holdsky/article/details/87270013#_87]

启用或关闭ARC

requires_arc
默认是启用ARC的;当指定不启用时,则会给xcode工程文件添加编译标志 -fno-objc-arc

所有文件启用或关闭ARC
Pod::Spec.new do |spec| 
   spec.requires_arc = true # true 启用  false 不启用 
end
部分文件启用ARC
Pod::Spec.new do |spec| 
   spec.requires_arc = ['a.m', 'b.mm'] #仅a.m , b.m启用arc,其他文件不启用arc
end

系统库依赖(苹果的库)

  • frameworkframeworks
Pod::Spec.new do |spec| 
   spec.ios.framework = 'CFNetwork'
   或
   spec.frameworks = 'QuartzCore', 'CoreData'
end
  • librarylibrarys
Pod::Spec.new do |spec| 
   spec.ios.library = 'xml2'
   或
   spec.libraries = 'xml2', 'z'
end

weak link 弱链接

  • weak_frameworkweak_frameworks
Pod::Spec.new do |spec| 
   spec.ios.weak_framework = 'CFNetwork'
   或
   spec.weak_frameworks = 'QuartzCore', 'CoreData'
end

设定编译标志

compiler_flags
传给xcode编译器的编译标志

Pod::Spec.new do |spec| 
   spec.compiler_flags = '-DOS_OBJECT_USE_OBJC=0', '-Wno-format'
end

预编译头 (prefix header)

prefix_header_contents
不建议使用此属性,因为Pod不应该污染其他库或用户工程的前缀头。

Pod::Spec.new do |spec| 
   spec.prefix_header_contents = '#import ', '#import '
end

prefix_header_file
不建议使用此属性,因为Pod不应该污染其他库或用户工程的前缀头。
前缀头文件的路径,用于注入pod项目的前缀头。 false表示不应生成默认的CocoaPods前缀头。 true是默认值,表示应生成默认的CocoaPods前缀头。

Pod::Spec.new do |spec| 
   spec.prefix_header_file = 'iphone/include/prefix.pch'
   或
   spec.prefix_header_file = false 
end

模块名字 (module_name)

module_name
表示生成的framework的名字。当不指定module_name时,framework的名子为name

Pod::Spec.new do |spec| 
   spec.name = 'Reachability'
   #因为设置了module_name,所以framework的名字是Hello而不是Reachability
   spec.module_name = 'Hello' 
end

CocoaPod使用--Podspec--制作Pod库_第1张图片

库文件规范

文件名匹配通配符

*当前目录的所有文件

  • c* 所有以c开头的文件
  • *c 所有以c结尾的文件
  • *c* 所有包含c的文件

** 递归匹配

  • abc/**/*.h abc目录以及子目录,所有以.h结尾的文件

{} 匹配任意一个

  • abc/**/*.{h,m} abc目录以及子目录,所有以.h和.m结尾的文件

更多参见https://guides.cocoapods.org/syntax/podspec.html#group_file_patterns

源代码

source_files
指定库包含的源代码文件

Pod::Spec.new do |spec| 
  spec.source_files = 'Classes/**/*.{h,m}', 'More_Classes/**/*.{h,m}'
end

公开的头文件

public_header_files
指定库对外暴露的头文件

Pod::Spec.new do |spec| 
  spec.public_header_files = 'Headers/Public/*.h'
end

私有的头文件

private_header_files
指定库私有的头文件

Pod::Spec.new do |spec| 
  spec.private_header_files = 'Headers/Private/*.h'
end

库自身包含framework

vendored_frameworks

Pod::Spec.new do |spec| 
  spec.vendored_frameworks = 'MyFramework.framework', 'TheirFramework.framework'
end

通常,当希望对外公开源代码时,可以使用这个属性。即,将源代码编译成framework,并将路径指定给vendored_frameworks

库自身包含静态库(.a)

vendored_libraries

Pod::Spec.new do |spec| 
  spec.vendored_libraries = 'libProj4.a', 'libJavaScriptCore.a'
end

通常,当希望对外公开源代码时,可以使用这个属性。即,将源代码编译成静态库,并将路径指定给vendored_libraries

注意,使用此属性时最好要确保静态库的命名符合libXXX.a格式,即前缀lib,扩展名.a

库包含资源文件,并希望打包成bundle

resource_bundles

Pod::Spec.new do |spec| 
  spec.resource_bundles = {
   'MapBox' => ['MapView/Map/Resources/*.png'],
   'MapBoxOtherResources' => ['MapView/Map/OtherResources/*.png']
 }
end

上面示例,

  • 将MapView/Map/Resources的所有png文件打包成MapBox.bundle
  • 将MapView/Map/OtherResources的所有png文件打包成MapBoxOtherResources.bundle

库包含资源文件

resources

Pod::Spec.new do |spec| 
  spec.resources = ['Images/*.png','Resources/HockeySDK.bundle']
end

这个属性认为bundle也是一种资源文件

排除某些文件

exclude_files
表示库不需要包含的文件

Pod::Spec.new do |spec| 
  spec.exclude_files = 'Classes/**/unused.{h,m}'
end

受保护的路径

preserve_paths
表示,这些路径下的文件,不会被CocoaPod移除,即便它们已经不匹配规范文件定义了
默认情况下,CocoaPod会移除不再匹配规范文件定义的文件

Pod::Spec.new do |spec| 
  spec.preserve_paths = 'Frameworks/*.framework'
end

你可能感兴趣的:(Xcode,ios,炒冷饭)