——> 指向为依赖方向,—/—> 表不可依赖
业务 ——> 基础
业务 ——> 功能
功能—/—> 基础
索引库名称
索引库url
组件
的远程私有仓库
本地组件
pod私有库模板
(工程名称)
pod intall
pod repo push 远程仓库名称 私有库名称.spec
这里列举常见字段,以及如何做源码与.framework静态库兼容的配置:
s.branch = '分支名'
s.summary = 'xxx'
# 本地组件库,可以不处理 s.homepage
s.homepage = '组件主页地址'
s.description = <<-DESC
"xxxxxx字数要比s.summary多"
# 本地组件库,可以不处理 s.source
s.source = {:git => '组件远程仓库地址' }
# 添加依赖库
# 没有拆分出子库情况下的写法
# s.dependency 'AFNetworking'
# s.dependency 'SDWebImage'
# 如果添加子库,要修改source_files
# s.source_files = 'TestRepo/source/**/*'
# 指定库的最低swift版本
# s.swift_version='5.0'
# 源码与.framework静态库兼容,使用环境变量参数处理,这里根据if else判断得知,默认会下载TestRepo.framework
if ENV['is_source'] || ENV['TestRepo_source']
# 添加子库
# Base=>子库名,b=>子库别名
s.subspec 'Base' do |b|
b.source_files = 'TestRepo/classes/Base/**/*'
end
# 在子库中声明依赖
s.subspec 'Tool' do |t|
t.source_files = 'TestRepo/classes/Tool/**/*'
t.dependency 'AFNetworking'
end
s.subspec 'Categray' do |c|
c.source_files = 'TestRepo/classes/Categray/**/*'
c.dependency 'SDWebImage'
end
s.subspec 'Business' do |b|
b.source_files = 'TestRepo/classes/Business/**/*'
end
else
# 指定 .a 库
# s.vandored_libraries = 'libName'
s.source_files = 'TestRepo/classes/TestRepo/**/*.h'
# vandored_frameworks .framework 库
# 仅仅是针对编译后的是framework的库起作用,当依赖于某个.framework三方库,或者项目不暴露源码时,启用该选项
s.vandored_frameworks = 'TestRepo/Products/TestRepo.framework'
# 启用静态库
s.static_framework = true
# 指定 framework 的 bundle 资源
# s.resource_bundles = {
# 'TestRepo' => ['TestRepo/Assets/**/*.png']
# }
pod lib create
,建议将资源文件自己放入.bundle文件中保存,一定程度保护文件名不被随意修改Add folders
选项改为 Create folder references
。ENV['']
变量使用方式:pod install时,在命令前指定指定变量。例如:
is_source=1 pod install
s.resource_bundles
extension UIImage {
convenience init?(imageName: String, currentClass: AnyClass) {
let codeBundlePath = (Bundle(for: currentClass).path(forResource: "TestRepo.bundle", ofType: nil) ?? "") as NSString
let filePath = codeBundlePath.appendingPathComponent((imageName + "@2x.png"))
self.init(contentsOfFile: filePath)
}
}
处理Assets中的图片资源工具
提取Assets.car中的图片
s.subspec
pod 'TestRepo', :subspecs=> ['Categray','Business']
'pod 'TestRepo/Categray'
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['SWIFT_VERSION'] = '5.0'
config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
end
end
end
组件的远程私有仓库
git add .
本地添加修改git commit -m ""
本地提交git branch -M master
建立分支git remote -v
查看远程地址(选用)git remote rm origin
删除远程地址(选用)git remote add origin 组件的远程私有仓库url
添加新的远程地址git push -u origin master
提交到远程git tag "版本号"
# .podspec文件中的版本号
s.version = '1.0.0'
git push --tags
( 指定标签推送 git push origin xxx)git tag -d 要删除的标签
(删除本地)git push origin :标签名
(删除远程 )pod lib lint
(本地验证)pod spec lint
(远程验证)pod repo push 远程仓库名称 私有库名称.spec
通过 pod spec lint 验证后,执行第三步
,第三步会自动再次验证
.podspec
的文件夹下pod lib lint
(本地验证)pod spec lint
(远程验证)pod repo push 远程仓库名称 私有库名称.spec
--allow-warnings
可以忽略提交时的校验警告(最好不要有警告,有时导致使用私有库时偶尔出现编译报错)push成功后,对应远程索引库也会自动更新
pod repo push TestRepo TestComponent.spec --allow-warnings
查看本地索引库列表:
pod repo
添加readme文件
,根据需要选择public或者private(例:公司使用)pod repo add 自定义空的远程仓库名称 远程库地址
pod repo add TestRepo https://github.com/xxx/TestRepo.git
删除指定私有库: pod repo remove
库名称
要在Podfile文件中,注明组件库对应的source
# platform对应组件版本
platform :ios, '9.0'
# 官方source
source 'https://github.com/CocoaPods/Specs.git'
# 自己的source
source '组件对应的索引库地址'
pod '组件名称'
pod install
时, 警告
[Xcodeproj] Generated duplicate UUIDs xxxxxx原因:工程不同文件夹下有同名文件。
解决:检查工程中的重复文件,并删除或处理同名文件。
方案一:
直接忽略警告
pod repo push TestRepo TestComponent.spec --allow-warnings
方案二:
在 .podspec 的.frameworks
字段补充library,具体需要填写的frameworks名称,参考测试组件工程生成的.app包中framework文件夹。
示例:
s.frameworks = 'libswiftCore','libswiftCoreFoundation','libswiftCoreGraphics','libswiftCoreImage','libswiftDarwin','libswiftDispatch','libswiftFoundation','libswiftMetal','libswiftObjectiveC','libswiftos','libswiftQuartzCore','libswiftUIKit'
- 查看远程对应tag对应工程是否有资源,无资源重新 git push
- `pod cache clean --all`(清除本地缓存)
pod search 组件库
错误:找不到库
pod search 组件库
,生成新的缓存,可匹配新的库该错误并不影响正常安装和使用
Your configuration specifies to merge with the ref 'refs/heads/master' from the remote, but no such ref was fetched.
如果在新建一个空的远程仓库,
没有添加readme文件
,这个报错正常,此时在本地目录添加一个readme文件,commit 后 push 即可。
# 上传tag,以版本0.1.0为例:
git tag 0.1.0
git push --tags
# 删除tag
git tag -u 0.1.0
git push origin :0.1.0
# 重新上传tag
git tag 0.1.0
git push --tags
清理 pod 缓存后,update
pod cache clean --all
# 使用更新命令
pod update --no-repo-update
# 如果无效,使用
pod update
ERROR | [iOS] unknown: Encountered an unknown error (/Applications/Xcode.app/Contents/Developer/usr/bin/xcrun simctl list devices
这个错误是因为依赖库(s.dependency)包含了.a静态库造成的。虽然这并不影响Pod的使用,但是验证是无法通过的。可以通过–use-libraries来让验证通过。解决方法:
pod spec lint xxx.podspec --verbose --use-libraries
在push的时候使用:
pod trunk push xxx.podspec --allow-warnings --use-libraries
clang: error: linker command failed with exit code 1 (use -v to see invocation) ID file not found
使用 pod lib lint --verbose
命令得知错误详情,私有库中的静态库不支持i386架构:
** BUILD FAILED **
The following build commands failed:
Ld /Users/xxx/Library/Developer/Xcode/DerivedData/App-eirdvplvkjwfajgnpucugqsajotp/Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/i386/Binary/App normal i386
lib验证
pod lib lint --verbose --use-libraries --allow-warnings
在 podspec 文件中添加
s.pod_target_xcconfig = { 'VALID_ARCHS[sdk=iphonesimulator*]' => '' }
另一种写法,也可指定支持的架构:
s.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 arm64' }
如果项目已经设置 pod_target_xcconfig,添加到已有值的后面。设置此处将在 模拟器编译时不产生二进制文件。
pod repo lint --skip-import-validation
pod repo push --skip-import-validation
pod repo push 命令详情链接
参考:文章链接