Mac 系统升级后可能导致 pod
指令无法被识别,终端下执行:
sudo gem install -n /usr/local/bin cocoapods
pod
版本落后太多,需要升级
$ pod setup
过程很漫长,现在总共500多M, 其实漫长过程的原因并不仅仅是因为文件的大小,还有就是 .podspace
文件的个数,在执行 pod setup
时下载速度一直上不去,如果下载速度高于 50KiB/s,那已经算是很快了。...
$ pod setup
Setting up CocoaPods master repo
$ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
--progress
Cloning into 'master'...
remote: Counting objects: 2402398, done.
remote: Compressing objects: 100% (174/174), done.
Receiving objects: 0% (5138/2402398), 1.02 MiB | 23.00 KiB/s
而且很容易失败,一旦失败就需要重新 pod setup
, 实在是坑啊。
[!] CocoaPods was not able to update the `master` repo. If this is an unexpected issue and persists you can inspect it running `pod repo update --verbose`
网上给出了自己下载 Specs
的方式, 到 pod repos
目录下,执行 git clone
$ cd .cocoapods
$ cd repos
$ git clone https://github.com/CocoaPods/Specs.git
下载过程也比较慢
$ git clone https://github.com/CocoaPods/Specs.git
Cloning into 'Specs'...
remote: Counting objects: 2405637, done.
remote: Compressing objects: 100% (468/468), done.
Receiving objects: 11% (280454/2405637), 55.96 MiB | 26.00 KiB/s
下载完后需要修改下文件夹名称
$ mv Specs master
或者直接从 Github
中下载 master
压缩包,过程会快很多。
https://github.com/CocoaPods/Specs
当然,既然可以直接下载,那拷贝的方法也是行的通的,从可用的 Mac 中拷贝
master
文件夹,当然拷贝之前最好先压缩文件。路径可以直接使用 open
打开
$ cd ~
$ open . .cocoapods/
repos
文件夹下会包含 pod repo
指令下的所有 repos
, 拷贝自己需要的就可以。
i、注:只有执行过
pod setup
指令后才会在根目录下生成.cocoapods
文件夹;
ii、由于master
文件夹中文件过多,近300w,所以压缩和解压缩都需要一段时间,但相对pod setup
和下载来说,速度还是快很多;
iii、可以直接使用File
下的 隔空投送 功能来完成压缩文件的传输,速度很快
或者使用清华大学的pod repo
源 (最近2019~2021 几次都是用清华的源,比较稳定,速度也较快)
$git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git
pod lib lint
出错整理
- 使用一些第三方框架
fatal error: 'TZImagePickerController.h' file not found
#import <TZImagePickerController.h>
^~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
会发现工程运行一切正常,库在工程中是存在的,可为什么在 lint
的时候就找不到了呢?其实 lint
操作跟本地的 Pods
库没有任何关系,真正相关的是 .podspec
文件中的引用。
Analyzing dependencies
Inspecting targets to integrate
Using `ARCHS` setting to build architectures of target `Pods-App`: (``)
Fetching external sources
-> Fetching podspec for `SutterController` from `/Users/sutter/Git/xxx`
Resolving dependencies of
Comparing resolved specification to the sandbox manifest
A AFNetworking
A MBProgressHUD
A MJRefresh
在检查完依赖库后就开始下载工作
Downloading dependencies
-> Installing AFNetworking (3.1.0)
> Copying AFNetworking from
`/Users/sutter/Library/Caches/CocoaPods/Pods/Release/AFNetworking/3.1.0-5e0e1`
to
`../../../../private/var/folders/ym/_dssx8q56_d2tbsl34yyqpqc0000gn/T/CocoaPods-Lint-20180906-3794-ws9gfz-SutterController/Pods/AFNetworking`
-> Installing MBProgressHUD (0.9.2)
所以本地的 pod
文件并不会影响 lint
操作,认真检查 .podspec
文件即可。
Generating Pods project
- Creating Pods project
- Adding source files to Pods project
- Adding frameworks to Pods project
- Adding libraries to Pods project
- Adding resources to Pods project
- Linking headers
- Installing targets
- Installing target `AFNetworking` iOS 7.0
- Installing target `MBProgressHUD` iOS 4.3
...
下载完成之后生成 pod project
,然后对整个项目进行整合
Integrating client project
这个过程包括
Adding Build Phase '[CP] Embed Pods Frameworks' to project.
Adding Build Phase '[CP] Copy Pods Resources' to project.
Adding Build Phase '[CP] Check Pods Manifest.lock' to project.
- Running post install hooks
直白一点就是先把 Frameworks
和 Resources
整到工程中,然后在检查 Manifest.lock
文件,打开本地的 Podfile.lock
文件可以看到里面记录的都是依赖库的版本号、校检编号,证书编号信息,应该是拿两个 .lock
文件这些信息对比,出于安全考虑,防止恶意更改的一种方式。
PODS:
- AFNetworking (3.1.0):
- AFNetworking/NSURLSession (= 3.1.0)
- AFNetworking/Reachability (= 3.1.0)
...
DEPENDENCIES:
- SDWebImage (~> 4.0.0)
...
SPEC CHECKSUMS:
AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67
...
PODFILE CHECKSUM: 26d4b40e0cee1c222c96dcf889411ddfe0c0bd76
检验完成后 pods
才算是安装完成。
-> Pod installation complete! There is 1 dependency from the Podfile and 14 total pods installed.
Building with xcodebuild.
...
然后跟编译过程原理一致,先对依赖库进行逐个检查,校检过程会执行 Clean
和 rm
操作,用完即删,不留一片云彩。
=== CLEAN TARGET AFNetworking OF PROJECT Pods WITH CONFIGURATION Release ===
Check dependencies
Clean.Remove clean /Users/Sutter/Library/Developer/Xcode/DerivedData/Build/Products/Release-iphonesimulator/AFNetworking/AFAutoPurgingImageCache.h
builtin-rm -rf /Users/Sutter/Library/Developer/Xcode/DerivedData/Build/Products/Release-iphonesimulator/AFNetworking/AFAutoPurgingImageCache.h
...
** CLEAN SUCCEEDED **
依赖检查完后进行 build
操作,这个过程跟 Xcode build
过程一致,会对类,属性,方法等进行统一的 build
操作,这时候如果有报错,会终止抛出异常,warning
也会体现出来,好在 warnings
还是很明显的,会具体到代码的位置。
/Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m:259:23: warning: 'boundingRectWithSize:options:attributes:context:' is only available on iOS 7.0 or newer [-Wunguarded-availability]
boundingRectWithSize:size
^~~~~~~~~~~~~~~~~~~~~~~~~
/Pods/MBProgressHUD/MBProgressHUD.h:88:45: warning: this block declaration is not a prototype [-Wstrict-prototypes]
typedef void (^MBProgressHUDCompletionBlock)();
^
void
...
1 warnings generated.
如果 pod build
成功,下一步就会联合编译 TARGET
和 PROJECT
=== BUILD TARGET App OF PROJECT App WITH CONFIGURATION Release ===
Check dependencies
...
Write auxiliary files
/bin/mkdir -p **/App.build/Objects-normal/x86_64
/bin/mkdir -p **/App.build/Objects-normal/i386
write-file **/App.build/Objects-normal/x86_64/App.LinkFileList
write-file **/App.build/App-project-headers.hmap
write-file **/App.build/Script-F5B6110FCD3AB9C348311ABC.sh
...
编写辅助文件,包括创建指令集,资源文件列表,头文件索引映射,还有编译脚本。
生成 App.app
目录文件, 及签名
Create product structure
/bin/mkdir -p **/Release-iphonesimulator/App.app
Entitlements:
{
"application-identifier" = "DKDGV92***.";
"keychain-access-groups" = (
"DKDGV92***."
);
}
CodeSign **/Release-iphonesimulator/App.app
完成后提示 lint
结果及测试结果。
** BUILD SUCCEEDED **
Testing with xcodebuild.
- WARN | xcodebuild:
- NOTE | xcodebuild:
...
xxx passed validation.
- 2
- ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for ... depended upon by ...
这种错误一般是因为项目中引入了非 master repo
的 pod
文件造成的,需要在进行 pod lib lint
的时候加入 repo
搜索源,--sources='[私有源地址] ,[github地址]'
- 3
ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries
这种错误是在.podspec
中引入了静态库造成的,使用--use-libraries
允许引入静态库。
最后把 pod
库推到远程
- 如果是
github
, 执行pod trunk push [xxx.podspec]
- 如果是私有源,执行
pod repo push [私有源名称] [xxx.podspec] --sources='[私有源地址],[github地址]'
- 之前有
WARN
的话,建议还是加上--allow-warnings
参数 - 参数
--verbose
可以实时反馈当前push
进程
如果不晓得 [私有源名称],可以执行 pod repo
查看已存在的源
最后收到
Already up-to-date.
Adding the spec to the [私有源名称] repo
- [Update] xxx
Pushing the [私有源名称] repo
就宣告完成了。
如遇到在执行 pod search
时搜不到指定库,或者刚更新的版本,但是在 git 上可以看到更新的版本,这时可能需要删除下 search_index.json
文件,然后再执行 pod search
操作
- 终端输入
rm ~/Library/Caches/CocoaPods/search_index.json
- 删除成功后再执行
pod search
参考:
CocoaPods 使用经验小记