注:此文章是为了给我们同组同事参考使用,因为我们项目目前已经配置好了faselane脚本,可以自动更新上传私有库,其余人想建私有库的话参考第二大步或私我探讨,其余步骤只做参考。
一、准备工作
1、保证本地CocoapodsSpec目录名称正确,查看命令:pod repo
(等下私有库脚本、主工程脚本自动更新本地私有库CocoapodsSpec时会用)
如果私有库文件名称不对的话需要调整一下:
① 删除repos目录下私有库
② 添加私有库的CocoapodsSpec,执行命令:
pod repo add CocoapodsSpec https://。。。CocoapodsSpec.git # 我们项目CocoapodsSpec地址
2、安装一下fastlane:sudo gem install fastlane 或 sudo gem install fastlane -NV
二、搭建私有库
1、开始搭建私有库
① 进到常用路径,比如:cd desktop
② 创建私有库:pod lib create 私有库名称
2、回答几个问题
3、安装cocoapods
① 上一步做完就会自动创建一个工程并打开,先cd 到新建项目的example文件下
② 安装cocoapods:pod install --no-repo-update
4、添加文件和资源文件到私有库下的assets和classes目录下
5、开始编写私有库的podspec文件:
网上参考写法:
我们项目里注意一下:
① 注意:s.summary改成项目名称,不然可能会验证警告,参考:s.summary = 'QQingThemeColorLib'
② 设置默认使用source还是framewrok:
s.default_subspec = 'source'
③ souce和framework请按下面目录结构(framework这个时候先注释掉,后续跑fastlane时才真正用上,按照这种目录结构写,便于后续项目中运行脚本,可以直接切源码修改,并使用脚本更新上传私有库):
参考写法:
s.default_subspec = 'source'
s.subspec 'source' do |source|
source.source_files = 'QQingThemeColorLib/Classes/**/*.{h,m}'
end
# s.subspec 'framework' do |framework|
# framework.vendored_frameworks = 'QQingThemeColorLib/framework/QQingThemeColorLib.framework'
# end
④ 配置完成了之后,还是在example文件下更新pods:pod update --no-repo-update
6、如果要依赖其他私有库(没有依赖库跳过此步骤),podspec可以参考QQingThemeColorLib库:
s.default_subspec = 'source'
s.static_framework = true
s.dependency 'QQingJRSwizzleLib'
s.frameworks = "UIKit"
s.subspec 'source' do |source|
source.source_files = 'QQingThemeColorLib/Classes/**/*.{h,m}'
end
s.subspec 'framework' do |framework|
framework.vendored_frameworks = 'QQingThemeColorLib/framework/QQingThemeColorLib.framework'
① 增加相关依赖
# 依赖QQingJRSwizzleLib
s.dependency 'QQingJRSwizzleLib'
② 添加:s.static_framework = true(不加的话不支持动、静态库共存,后面更新私有库可能会报错)
解读:意思QQingThemeColorLib只有souce没有framework,不能和QQingReachabilityLib的framework共存
③ 放开framework的注释,不放开等下验证本地私有库时可能验证不过
s.subspec 'source' do |source|
source.source_files = 'QQingThemeColorLib/Classes/**/*.{h,m}'
end
s.subspec 'framework' do |framework|
framework.vendored_frameworks = 'QQingThemeColorLib/framework/QQingThemeColorLib.framework'
end
④ 在Podfile里面增加source:
source 'https://...CocoapodsSpec.git' # 我们项目CocoapodsSpec地址
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
platform :ios, '8.0'
target 'QQingThemeColorLib_Example' do
pod 'QQingThemeColorLib', :path => '../'
target 'QQingThemeColorLib_Tests' do
inherit! :search_paths
end
end
⑤ 执行命令:pod repo update CocoapodsSpec
(更新本地CocoapodsSpec文件)
⑥ 然后安装pods依赖库,执行:pod install
7、跑一下私有库看能否运行,不能运行就解决相应报错(可能podspec文件写法有问题、依赖的库没有导入等,解决完报错在运行:pod update --no-repo-update)没有报错就继续下一步
8、运行通过之后,回到私有库根目录!回到私有库根目录!回到私有库根目录!开始本地验证私有库
(如果做过上面第6步的,可以使用下面5或6方法验证,主要还是上面说的source和framework不共存的问题,后面使用fastlane时会自动打包framework,就不会有问题了)
//进入我们的pod库根目录中
wangpengdeiMac:~ wangpeng$ cd /Users/wangpeng/Desktop/MyPodsTest
//执行本地验证的命令
wangpengdeiMac:MyPodsTest wangpeng$ pod lib lint
这里说明一下,本地验证的命令有几个推荐的:
1、本地验证
pod lib lint
2、本地验证+打印详细信息
pod lib lint --verbose
3、本地验证+允许使用静态库
pod lib lint --use-libraries
4、本地验证+允许警告
pod lib lint --allow-warnings
5、本地验证+快速验证
pod lib lint --quick
6、本地验证+三方库验证
pod lib lint --sources=[https://gitlab.changingedu.com/ios/CocoapodsSpec.git,https://github.com/CocoaPods/Specs.git](https://gitlab.changingedu.com/ios/CocoapodsSpec.git,https://github.com/CocoaPods/Specs.git) --use-libraries --allow-warnings --verbose
验证通过:
9、发布项目:
1、添加远程地址,即在github上创建的私有库的地址QQingThemeColorLib
git remote add origin http://gitlab。。。/QQingThemeColorLib.git
2、添加文件
git add .
3、提交本地,并添加描述
git commit -m "第一次提交"
4、拉取远程的代码
git pull origin master
如果打印:fatal: couldn't find remote ref master(不需要管,因为我们是第一次推送到远端,远端是没有master的)
如果打印:fatal: refusing to merge unrelated histories# 原因是远程仓库origin上的分支master和本地分支master被Git认为是不同的仓库,所以不能直接合并,使用下面命令:
git pull origin master --allow-unrelated-histories
5、推送本地代码到远程
git push origin master
6、打tag
git tag 0.1.0
7、推送tag到远程
git push origin 0.1.0
8、设置master分支(不设置后面可能会报错)
git branch --set-upstream-to=origin/master master
10、这个时候看看远端仓库,应该已经成功了(没成功的话请自行调试以上步骤,看哪里有问题)
(网上介绍到这一步之后,会让上传podspec文件,我们项目不需要手动做,通过下面的fastlane,里面有我们自己写好的脚本,会自动上传)
三、通过fastlane打tag、上传代码、打包静态库、上传podspec
1、将现有私有库项目中的fastlane文件拷贝过来,放在新建的私有库根路径下
(可以使用QQingThemeColorLib,有些私有库的fastlane中没有设置打包package和push spec文件的source,可能会报错,这份经过测试ok)
2、修改fastlane相应文件:(注意下面第3步)
1、fastlane_push.h里面的库名改成新建的私有库名称(改动一处)
2、fastlane文件下actions里面的三个文件,里面作者改成自己(每个文件改动一处,也可不改)
3、Fastfile里面的库名改成新建的私有库名称(改动三处)
注意:如果最终制作的私有库不需要打包framework的,请去掉这个文件里打包静态库的脚本代码:
# pod_package 从远端分支-打包静态库(所以需要先提交源代码)
pod_package(tName:targetName, v:tagName)
4、README.md里面的库名改成新建的私有库名称(改动一处)
3、一切改完之后,打开podspec文件下面framework的注释(不需要打包静态库的,这里就不需要了)
s.default_subspec = 'framework'
s.static_framework = true
s.subspec 'source' do |source|
source.source_files = 'QQingThemeColorLib/Classes/**/*.{h,m}'
end
s.subspec 'framework' do |framework|
framework.vendored_frameworks = 'QQingThemeColorLib/framework/QQingThemeColorLib.framework'
end
4、通过脚本打tag、上传源码、静态库、以及podspec文件等
cd到私有库根目录下,开始执行fastlane命令::fastlane 私有库名称
(例如:fastlane QQingThemeColorLib)
这个时候会看到终端会执行Fastfile里面的各种命令,最终终端执行成功,自动上传源码、上传静态库、打tag、上传podspec文件,搞定。(中间产生的report.xml只是记录性的文件,可以忽略或直接上传)
4.1、我遇到有个报错:(意思说没有master分支,那就设置一下master,所以上面第二步第9项中,发布项目时,我提前加了这一句):
git branch --set-upstream-to=origin/master master
Exit status of command 'git pull && git fetch --tags' was 1 instead of 0.
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> master
4.2、 还遇到报错,podspec文件推不上去,一堆报错,看不懂,直到看到了
[!] Please close any current Xcode sessions and use App.xcworkspace
for this project from now on.
我就关闭了Xcode的私有库项目,然后重新打开,重新编译,再次fastlane命令,神奇的推送成功了!
[11:20:42]: Exit status of command 'pod repo push CocoapodsSpec 'QQingUIImageBlurLib.podspec' --allow-warnings --verbose' was 1 instead of 0.
Validating spec
QQingUIImageBlurLib (0.1.1) - Analyzing on iOS 8.0 platform.
Preparing
Analyzing dependencies
Inspecting targets to integrate
Using `ARCHS` setting to build architectures of target `Pods-App`: (``)
Fetching external sources
-> Fetching podspec for `QQingUIImageBlurLib` from `/Volumes/DiskTwo/工作空间 - 勿删/Demo/私有库/QQingUIImageBlurLib/QQingUIImageBlurLib.podspec`
Resolving dependencies of
Comparing resolved specification to the sandbox manifest
A QQingUIImageBlurLib
.
.
.
[!] Please close any current Xcode sessions and use `App.xcworkspace` for this project from now on.
Integrating target `Pods-App` (`../../../../../../var/folders/h1/b8hf90hn5fxfb48wg6p45fk80000gp/T/CocoaPods-Lint-20200426-6111-164htof-QQingUIImageBlurLib/App.xcodeproj` project)
Adding Build Phase '[CP] Embed Pods Frameworks' to project.
Adding Build Phase '[CP] Check Pods Manifest.lock' to project.
-> Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
Building with `xcodebuild`.
$ /usr/bin/xcodebuild clean build -workspace /var/folders/h1/b8hf90hn5fxfb48wg6p45fk80000gp/T/CocoaPods-Lint-20200426-6111-164htof-QQingUIImageBlurLib/App.xcworkspace -scheme App -configuration Release CODE_SIGN_IDENTITY=- -sdk iphonesimulator -destination id=6903BB69-F933-4698-8836-99A3B7CC79FE
2020-04-26 11:20:34.012 xcodebuild[6122:13757919] [MT] PluginLoading: Required plug-in compatibility UUID BAB79788-ACEE-4291-826B-EC4667A6BEC5 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/SimplePlugin.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2020-04-26 11:20:34.012 xcodebuild[6122:13757919] [MT] PluginLoading: Required plug-in compatibility UUID BAB79788-ACEE-4291-826B-EC4667A6BEC5 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/SimplePlugin-9.0.xcplugin' not present in DVTPlugInCompatibilityUUIDs
2020-04-26 11:20:34.013 xcodebuild[6122:13757919] [MT] PluginLoading: Required plug-in compatibility UUID BAB79788-ACEE-4291-826B-EC4667A6BEC5 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/SimplePlugin-8.2.xcplugin' not present in DVTPlugInCompatibilityUUIDs
Build settings from command line:
CODE_SIGN_IDENTITY = -
SDKROOT = iphonesimulator13.2
note: Using new build system
.
.
.
四、私有库的维护
1、以后在私有库里面继续改文件的话,分四步:
① 更新本地私有库:pod repo update CocoapodsSpec
② cd到Example文件下,更新当前私有库:pod update --no-repo-update
③ 开始修改私有库文件
④ 等改完之后执行fastlane命令:fatstlane 私有库名称
(会再次自动上传源码、上传静态库、打tag、上传podspec文件)
五、主工程内使用、更新上传私有库
1、主工程内使用私有库
① pofile里面增加依赖:
pod 'QQingThemeColorLib'
② 安装,执行命令:pod install
2、主工程内更改私有库代码,并自动更新私有库,分三步:
① 将私有库改为源码格式,例如:pod 'QQingThemeColorLib/source',然后运行:fastlane pull(拉取源码)
② 调整要更改的私有库代码
③ 通过脚本更新上传私有库代码:
- 工程内私有库使用framework的话运行:fastlane push
- 工程内私有库使用源码的话运行:fastlane push_source
六、注意问题
① 私有库名称必须按QQing...Lib的规则命名(因为脚本中是按此命名规则匹配私有库的)
② 私有库podspec里面默认使用source还是framework,在设计的最初要考虑好,未来所有依赖它的地方都使用这种默认格的,不统一的话就可能导致项目里面source和frmework共存。
# 就是这一句
s.default_subspec = 'source'
③ 私有库的文件夹格式必须按照source和framework的格式(便于脚本切换源码和framework)如下:
s.subspec 'source' do |source|
source.source_files = 'QQingThemeColorLib/Classes/**/*.{h,m}'
end
s.subspec 'framework' do |framework|
framework.vendored_frameworks = 'QQingThemeColorLib/framework/QQingThemeColorLib.framework'
end