补充:
2023-3-27 强制升级 pod 库
一、创建私有 Pod 索引库
Pod 索引库本质是所有库的podspec
文件集合。每次创建新库或更新版本时都会根据版本号上传新的podspec
文件,具体可以看cocoaPods索引库。
创建一个索引库,以Gitee
举例。创建一个新的私有库,名字建议以PrivatePodspecs
结尾,可以加前缀。
创建后需要初始化仓库,否则在推podspec
文件时会出现仓库未初始化导致推送失败的情况。之后打开终端,输入pod repo list
会显示目前的repo
列表。
pod repo list
---------------------
#这两个是安装完 Cocoapods 之后都会有的。在使用 pod search 时,会从repo列表中取寻找目标的库。
cocoapods
- Type: git (remotes/origin/master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/kenan/.cocoapods/repos/cocoapods
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/kenan/.cocoapods/repos/trunk
使用pod repo add [名称] [路径]
命令,将刚刚的索引库克隆地址添加到repo
列表中,例如:
pod repo add YTPrivatePodspecs [email protected]:fa_dou_miao/ytprivate-podspecs.git
#添加完成后再输入 pod repo list 查看。
cocoapods
- Type: git (remotes/origin/master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/kenan/.cocoapods/repos/cocoapods
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/kenan/.cocoapods/repos/trunk
YTPrivatePodspecs
- Type: git (master)
- URL: [email protected]:fa_dou_miao/ytprivate-podspecs.git
- Path: /Users/kenan/.cocoapods/repos/YTPrivatePodspecs
二、创建私有库
索引库完成后我们就可以创建真正的私有库了。首先在Gitee
上创建一个YTPrivateBaseKit
私有库【注意,除了索引库外,其他组件库不需要添加到repo列表】。然后再使用命令pod lib create [库名]
来创建本地项目,例如:
pod lib create YTPrivateBaseKit
#然后回答几个问题
#选择平台
What platform do you want to use?? [ iOS / macOS ]
> ios
#选择语言
What language do you want to use?? [ Swift / ObjC ]
> swift
#是否需要Demo
Would you like to include a demo application with your library? [ Yes / No ]
> yes
#是否使用测试工具
Which testing frameworks will you use? [ Quick / None ]
> none
#是否进行视图测试
Would you like to do view based testing? [ Yes / No ]
> no
完成后会自动打开项目,我这里选用的 Swift 语言,如果选择 OC 的话需要多回答几个问题,都是问你需不需要工具之类的,根据自己的情况设置即可。
项目打开后我们Show in Finder
,文件夹结构如下:
其中Example
文件夹为示例项目,实际上在真正上传时默认只会上传YTPrivateBaseKit
文件夹下的Classes
文件夹和Assets
文件夹中的文件。
所以我们将已经写好的库放入Classes
文件夹下并删除ReplaceMe
文件,然后进入Example
文件夹下执行pod install
命令,每次修改库的内容都需要对示例项目pod install
一次,如果需要依赖其他第三方库需要在podspec
文件中设置依赖,后边我会细说如何设置。
之后可以在示例项目中引用库,并写一些代码进行测试。注意!封装库的代码一定要控制好public
,open
,private
等访问级别。只有添加了public
或open
的类,属性和方法才可以被外界访问。
三、设置podspec
podspec
文件默认打开如下:(这里去除掉了注释部分,只留下基础内容)
Pod::Spec.new do |s|
# 库名称,默认和工程名相同,建议不改
s.name = 'YTPrivateBaseKit'
# 库的版本,每次升级版本后必须要在这里修改版本号
s.version = '0.1.0'
# 该库的简介,更改成适合的简介,使用默认简介会出现简介没有意义的错误
s.summary = 'A short description of YTPrivateBaseKit.'
# 详细描述,一般不用改,有readme呢
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
# 库的主页,需要更改为正确的主页
s.homepage = 'https://github.com/柯南/YTPrivateBaseKit'
# 许可,私有库可以不改
s.license = { :type => 'MIT', :file => 'LICENSE' }
# 作者,可以不改
s.author = { '柯南' => '[email protected]' }
# 库的克隆地址,这个地址必须改成正确的克隆地址,可以是 https 或 ssh
s.source = { :git => 'https://github.com/柯南/YTPrivateBaseKit.git', :tag => s.version.to_s }
# 该库最低支持版本,可以修改为对应版本
s.ios.deployment_target = '10.0'
# 该库上传文件的路径,默认是 Classes 文件夹下的所有文件夹及文件,默认不需要改
s.source_files = 'YTPrivateBaseKit/Classes/**/*'
#--------------------------------------------------
# 以下是默认没有但可以自行添加的基础配置
# 设置指定版本号或非指定版本号的依赖库,
s.dependency 'SnapKit'
# s.dependency 'SnapKit', '~> 0.1.0'
# 指定 Swift 语言版本,Swift 项目需要设置这个
s.swift_version = '4.2'
end
每次修改完podspec
文件文件后,也需要重新进入Example
文件夹pod install
一次。示例项目会自动安装所依赖的库,不需要单独在Podfile
文件中编写pod xxx
。
在完成对库的编写与测试后,将其推送到远程的私有仓库中并为其打上标签,标签的名称为podspec
中的version
版本号,注意需要推送标签。
在推送完成后,我们需要进入podspec
文件所在目录,对podspec
文件执行pod lib lint --allow-warnings
命令。例如:
pod lib lint --allow-warnings
#---------------------------------
-> YTPrivateBaseKit (0.1.0)
- NOTE | url: The URL (https://gitee.com/fa_dou_miao/ytprivate-base-kit) is not reachable.
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
- NOTE | [iOS] xcodebuild: /Users/kenan/YTPrivateBaseKit/YTPrivateBaseKit/Classes/123.storyboard:Y6W-OH-hqX: warning: “View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:]. [9]
YTPrivateBaseKit passed validation.
当出现passed validation
时证明验证成功,如果检测失败会出现类似[!] YTPrivateBaseKit did not pass validation, due to 47 errors.
的提示,可以通过给出的- ERROR
信息找到失败的原因。
之后再执行pod spec lint --allow-warnings
命令验证spec
。同样出现passed validation
时证明验证成功。接下来我们就可以将podspec
文件推到索引库中了。
四、推送私有库
在两次lint
验证都成功后,使用命令pod repo push [索引库名称] [podspec文件] --allow-warnings
进行推送,例如:
pod repo push YTPrivatePodspec YTPrivateBaseKit.podspec --allow-warnings
#------------------------------------------------------------
#当出现以下内容,并且没有 ERROR 时证明推送成功
Validating spec
-> YTPrivateBaseKit (0.1.0)
- NOTE | url: The URL (https://gitee.com/fa_dou_miao/ytprivate-base-kit) is not reachable.
- NOTE | xcodebuild: note: Using new build system
- NOTE | xcodebuild: note: Using codesigning identity override: -
- NOTE | xcodebuild: note: Build preparation complete
- NOTE | [iOS] xcodebuild: note: Planning
- NOTE | [iOS] xcodebuild: note: Building targets in dependency order
- NOTE | [iOS] xcodebuild: YTPrivateBaseKit/YTPrivateBaseKit/Classes/123.storyboard:Y6W-OH-hqX: warning: “View Controller“ is unreachable because it has no entry points, and no identifier for runtime access via -[UIStoryboard instantiateViewControllerWithIdentifier:]. [9]
Updating the `YTPrivatePodspec' repo
Adding the spec to the `YTPrivatePodspec' repo
- [Add] YTPrivateBaseKit (0.1.0)
Pushing the `YTPrivatePodspec` repo
推送成功后就可以使用pod search
搜索到啦!
pod search YTPrivateBaseKit
#---------------------------------
-> YTPrivateBaseKit (0.1.0)
一个私有库
pod 'YTPrivateBaseKit', '~> 0.1.0'
- Homepage: https://gitee.com/fa_dou_miao/ytprivate-base-kit
- Source: https://gitee.com/fa_dou_miao/ytprivate-base-kit.git
- Versions: 0.1.0 [YTPrivatePodspec repo]
之后可以新建一个项目测试能否通过Pod
安装,需要注意的是需要在Podfile
文件顶部添加上source
# 第一个为 cocoapods 索引库的地址
source 'https://github.com/CocoaPods/Specs.git'
# 第二个为私有索引库的地址
source '[email protected]:fa_dou_miao/ytprivate-podspecs.git'
use_frameworks!
platform :ios, '10.0'
target 'Demo' do
pod 'YTPrivateBaseKit'
end
只有添加了source
才可以在pod install
时搜索到私有库,不填加的话默认只会在cocoapods
索引中搜索。并且由于在podspec
文件中设置了依赖库,在pod install
时会自动将依赖的其他库安装进来。
在后续修改库的内容或升级代码后,只需要从第三步继续执行即可升级私有库。
五、设置图片资源
在私有库中可以通过xcassets
使用图片资源。首先将图片资源文件夹放入Assets
文件夹下。
并在podspec
文件中设置资源路径,然后重新pod install
一下,就可以在示例项目的pod
库中看到该资源文件夹。
s.resource_bundles = {
'YTPrivateBaseKit' => ['YTPrivateBaseKit/Assets/*.{xcassets}']
}
# 如果只是单个图片的话,可以用这种方式
# s.resource_bundles = {
# 'YTPrivateBaseKit' => ['YTPrivateBaseKit/Assets/*.png']
# }
但私有库中的图片不能直接通过UIImage(named: String)
使用。因为命名空间的存在,当项目引入私有库后,使用named
加载图片默认使用的是当前项目的命名空间,而我们的图片资源存放在私有库中,需要使用私有库的命名空间才可以获取。
我们可以在私有库中通过以下方式获取资源图片。
// 1. 通过命名空间创建 Bundle,命名空间默认就是私有库的名称
public class func frameworkBundle(_ name: String) -> Bundle? {
var frameworksUrl = Bundle.main.url(forResource: "Frameworks", withExtension: nil)
frameworksUrl = frameworksUrl?.appendingPathComponent(name)
frameworksUrl = frameworksUrl?.appendingPathExtension("framework")
guard let frameworkBundleUrl = frameworksUrl else {
return nil
}
let bundle = Bundle(url: frameworkBundleUrl)
frameworksUrl = bundle?.url(forResource: name, withExtension: "bundle")
guard let bundleUrl = frameworksUrl else {
return nil
}
return Bundle(url: bundleUrl)
}
// 2.通过 Bundle 获取图片
public class func getImage() -> UIImage? {
var bundle: Bundle?
if let url = Bundle.main.url(forResource: "YTBaseImages.xcassets", withExtension: nil) {
bundle = Bundle(url: url)
}else {
bundle = BaseKit.frameworkBundle("YTPrivateBaseKit")
}
let image = UIImage.init(named: "111", in: bundle, compatibleWith: nil)
return image
}
除了图片资源外,其他的资源文件也可以通过该方法获取。
六、设置子库
Pod
库除了可以直接安装全部功能外,还可以通过子库的方式安装部分功能,例如:
pod 'YTPrivateBaseKit/Core'
pod 'YTPrivateBaseKit/Extension'
首先将你的模块分类
然后在podspec
文件中设置不同模块的文件路径。
#注释掉原本的模块路径
# s.source_files = 'YTPrivateBaseKit/Classes/**/*'
# 这里是设置默认安转的模块,不设置的话执行 pod 'YTPrivateBaseKit' 时默认安装全部模块,设置后默认只安装设置的模块
# s.default_subspecs = "Core"
# Core 子模块
s.subspec 'Core' do |sp|
# 分别设置子模块的文件路径与资源路径
sp.source_files = 'YTPrivateBaseKit/Classes/Core/**/*'
sp.resource_bundles = {
'YTPrivateBaseKit' => ['YTPrivateBaseKit/Assets/*.{xcassets}']
}
end
# Extension 子模块
s.subspec 'Extension' do |sp|
sp.source_files = 'YTPrivateBaseKit/Classes/Extension/**/*'
end
设置后重新将私有库推送升级,即可在使用时通过YTPrivateBaseKit/Core
或YTPrivateBaseKit/Extension
按需安装功能库。
七、强制升级pod库
当我们使用某些库时会出现
pod lint
失败的问题,例如在使用Kingfisher
的时候,由于项目不支持SwiftUI
, 会导致pod lint
失败。但是我们又想用这个库,可以使用手动升级的方式。步骤与代码升级类似:
1.首先将我们的私有库推上去,打上标签,注意标签需要推送。2.将
PrivatePodspec
索引库拉取到本地,打开对应私有库的文件夹,新建一个对应版本号的文件夹,然后将新的podsepc
文件放进去,然后推送。目录结构如下图
然后就强制升级成功啦,可以使用 pod install 进行安装。
以上便是快速搭建私有库的全部流程了
如果觉得有用的话就点个赞吧