
根据pod的使用原理,当使用pod install 安装库时,会在索引仓库中搜对应的库,搜到后,根据索引仓中的spec文件中的信息,去对应的git仓库中拉取相应的代码。基于此,我们添加一个私有索引仓即可。官方文档:构建私有pod
本文记录创建私有仓的方法,以及提交一个测试项目到私有仓,再通过pod的方式加载测试项目的步骤。
我们需要准备两个空的远程仓库,一个作为私有索引库作为全部spec的存放仓库即索引库,另一个为模拟要发布的私有组件仓库。
这一步是通过pod 自带的cli命令创建项目,该项目中会将需要发布的代码以本地pod的方式引入,并同时创建测试项目以及对应的配置文件,为之后的发布做好准备。
将空仓库私有组件库clone到本地,cd进入目录后输入pod lib create XXXX创建新项目,XXXX 是项目名称,一般都会以组件名称命名。我们这里使用BaseMoudle作为组件名称,输入pod lib create BaseMoudle,然后填写相关信息后会自动生成项目(这里单词写错了,应该是Module,忽略这个小问题):
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> no
What is your class prefix?
> Test
完成后项目会自动打开,项目结构如下:

目录结构如下:

最左边的BaseMoudle是git仓库clone的目录,中间的BaseMoudle是pod创建的项目所在的文件夹,右边的BaseMoudle才是真正放库代码的地方。
此时,发现git不能提交,并没有识别到这个新创建的项目,这是因为该文件夹下也有.git文件,这是pod的项目下载下来的,删掉即可(如果没有可以按键command + shift + . 显示隐藏文件)。
同时,为了方便期间,我们把中间这个多余的BaseMoudle层级也删除掉。
最终,目录结构如下:

.podspec 文件是存放在索引库中的,pod会根据该文件中的配置去下载对应的文件。该文件最终会上传到索引库中。
打开工程后,找到BaseMoudle..podspec文件,该文件是默认生成的,必须修改的字段如下:
s.summary = '基础库'
s.description = <<-DESC
这里填写比summary更多的内容做为描述
DESC
s.homepage = '填写库的地址,比如https://gitee.com/xxxxx/xxxxx'
s.source = { :git => '填写库的代码地址,比如https://xxx.git', :tag => s.version.to_s }
这里,我们添加一些测试代码,需要将组件的代码放到这个文件夹下(ReplaceMe文件可以删除)。

正确的代码添加的方式是将代码放在和BaseMoudle.podspec同层级的BaseMoudle ->Classes文件夹下,然后在Example文件夹下执行pod install加载代码到项目中(即这是一个本地pod引入代码方式)。
version字段一致。默认这里是0.1.0。在BaseMoudle.podspec同级目录中,可以使用指令pod spec lint 对文件进行验证(会检测填写的远程地址的是否可用,以及一些其他的合法性检测。)
注意:
- s.description 必须比 s.summary 更长,这里的格式也不能修改,写在DESC两个关键字中间一行
- s.source中,
:git =>字段,这里如果写git@xxx.git这种地址,则需要使用pod ''xxx" 的用户是配置了SSH认证方式,否则会有权限错误。所以通常这里写https://xxx.git这样的方式确保可以正常拉取代码。- s.source中,
:tag =>字段,理论上tag是一个字符串(git中关于tag官方文档描述),但仍需遵循一些规则。
tag中关于名称的描述
具体规则详见文档。通常,我们以一个类似0.1.0这样的方式设置tag。这是因为,在pod管理中,可以使用一些方式限定加载的版本,比如~>之类的,只有这样的版本号才能正确解析。否则就需要指定版本号。
在执行pod install 的时候,会在当前的pod索引库中查找库(使用pod repo指令可以查看当前所有的索引库),为了能查询私有索引仓,我们需要添加私有仓地址到搜索库中。
使用pod repo add XxxName XxxPath( 其中XxxName是自定的repo名称,比如PrivateRepo,XxxPath为该索引库的地址,比如 https://xxx.git)指令添加一个私有的全局pod 索引库。
添加完成后,可以使用pod repo查看列表是否添加成功。
// 输入pod repo 后查看索引库信息
cocoapods
- Type: git (remotes/origin/master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/x/.cocoapods/repos/cocoapods
Private
- Type: git (master)
- URL: https://xxx.git
- Path: /Users/x/.cocoapods/repos/Private
trunk
- Type: CDN
- URL: https://cdn.cocoapods.org/
- Path: /Users/x/.cocoapods/repos/trunk
在BaseMoudle.podspec文件的所在的目录下执行pod repo push PrivateRepo BaseMoudle.podspec,表示给PrivateRepo索引库中推送podspec(这里是pod的推送命令,并不是git的推送命令,该指令会检查.podspec文件的合法性):
Validating spec
-> BaseMoudle (0.1.0)
- WARN | source: Git SSH URLs will NOT work for people behind firewalls configured to only allow HTTP, therefore HTTPS is preferred.
- WARN | url: The URL (https://xxx.git) 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: warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')
Updating the `PrivateRepo' repo
Adding the spec to the `PrivateRepo' repo
- [Add] BaseMoudle (0.1.0)
Pushing the `PrivateRepo' repo
可以看到,这里会自动执行Pushing thePrivateRepo' repo`指令,即对远程索引仓库自动进行git的push操作,将其更新到远程仓库。
注意,这里可以直接不写
BaseMoudle.podspec参数,即pod repo push PrivateRepo,会自动查找当前目录下的.podspec文件。
默认pod 搜索的只是默认的索引库,我们需要在Podfile文件中添加更多的索引库地址。
创建一个新项目,初始化pod后,在Podfile文件最上方填写source信息(可通过pod repo指令查看),表示需要搜索的索引库地址,然后引入库文件pod 'BaseMoudle':
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git'
source 'https://xxx.git'
target 'test' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for test
pod 'BaseMoudle'
end
执行pod install 即可
当需要对库进行升级时,需要修改.podspec文件,同时,对代码重新打tag,和第二步一致。然后执行第四步,重新推送到本地repo。
在项目中,需要执行pod update --no-repo-update,更新文件。这里使用pod install 是不行的,因为在Podfile.lock文件中已经“锁定”了版本号,只有update指令才可以去更新这里的库,而--no-repo-update表示更新repo中的文件(本地索引库),私有的索引库已经更新了(第六步中重新推送到本地repo),使用该命令可以避免更新官方的索引库(如果没有显式的指定其他库的版本号,不加--no-repo-update会导致其他的库更新到最新版本从而引起一些问题)。
[iOS] file patterns: The `source_files` pattern did not match any file. 或者 [iOS] file patterns: The `resource_bundles` pattern for `xxx` did not match any file.
出现这中错误有几种可能:
字段设置错误
字段修改为第二步中的,特别是s.description,要在<<-DESC和DESC写注释,不能删掉
文件夹路径错误
在第一步中删掉多余的BaseMoudle层级才能正确匹配s.source_files = 'BaseMoudle/Classes/**/*'字段,如果没有删除,则这里应该为s.source_files = 'BaseMoudle/BaseMoudle/Classes/**/*'
版本号没有修改
更新版本后没有修改版本号s.version字段,即重复提交了相同的版本号。修改版本号后重新提交即可。
这个错误是由于没有打标签,会检测到找不到该标签。如果没有打标签这个错误不一定会有,gitee上不打也可验证通过,gitlab就会有这样的错误,可能和仓库有关系。但是在具体安装的时候(pod install),如果没有标签也会报错找不到该标签。
xxxx dependency were found, but they required a higher minimum deployment target.这个是安装的库的版本比podfile中的版本高,在.podspec文件中s.ios.deployment_target字段配置版本信息。
报错信息如下:
[!] Error installing xxxxxxx
[!] /usr/bin/git clone git@gitlab.xxxxx.xxxxx/xxxxx/xxxxxx.git /var/folders/f8/jkfbygnx2hvfx6s4k78vw51h0000gn/T/d20220406-63219-53c6s0 --template= --single-branch --depth 1 --branch 0.1.0
Cloning into '/var/folders/f8/jkfbygnx2hvfx6s4k78vw51h0000gn/T/d20220406-63219-53c6s0'...
ssh: Could not resolve hostname gitlab.autel.com: nodename nor servname provided, or not known
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
该问题并非git配置问题,是文件夹写入权限问题。执行一次sudo pod install输入电脑密码,再执行一次pod install即可正常安装。
当只有一个文件夹或者文件夹中是空的时候,pod在引入的时候会对其进行过滤。这是一个正常现象
WARN和NOTE仍然不能提交成功,提示[!] The `xxxxx.podspec` specification does not validate.
在后面添加--allow-warnings参数即可。参考文章
pod install仍然安装的是旧版本这个问题是pod的索引缓存问题,通过pod repo update XXX更新本地索引库即可。在本机上通过第四步已经推送到本地索引库上则无需此操作。
注意:这里自己虽然本地上的索引库已经更新,但是安装仍然是旧版,这是因为Podfile.lock这个文件中会锁定版本信息。我们可以先注释引入的pod库,然后执行pod install将其移除,再重新引入pod库,执行pod install即可安装到最新版本了。
- ERROR | [iOS] unknown: Encountered an unknown error (incompatible character encodings: UTF-8 and ASCII-8BIT) during validation.
检查s.source中配置的路径是否正确,这种错误往往是验证的url中存在异常字符
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U