2020.5.5修改:
1、首先创建私有索引库
2、有了私有索引库后再创建私有仓库
这里写的有点乱糟糟的,后面将重新整理,把私有索引库和私有仓库分两章写一下
我是分割线
https://www.jianshu.com/p/e5d3c7a7335a
https://www.jianshu.com/p/d6a592d6fced
https://blog.csdn.net/overstep1024/article/details/84543770
缘起
最近一系列996的呐喊,让很多公司确实稍微消停了一下,终于没那么忙了。还么松下来两天,bilibili、大疆先后爆出了程序员私自开源公司代码,一下子各大公司又紧张起来,包括我司。这不,前两天刚刚上了oa首页,即日起,公司内网停止访问github、gitlab、oschina等第三方开源软件托管平台,整个人都凉凉了。首先想到的就是我的cocoapods第三方怎么办,虽然有自己的私有库,但是还是有不少第三方直接用的pods,于是这次想着把第三方的也悉数迁移到私有库。
开始
首先,在自己的远程git仓库新建一个项目,这一块就不多说了。建好后,在本地
cd YourProjict
git clone git@yougitaddress.git
代码克隆下来后,在本地repo添加自己的私有库,回到上面clone下来的文件夹,创建你自己的pods和demo。
pod repo add mypods(私有库名称) https://github.com/xxxxx/xxxxx.git(私有库远程地址)
cd YourProjict
pod lib create mypods
这个命令会在你刚才的目录下,根据 cocoapods的 pods模板生成一个 pods工程,包含 pods以及 demo工程,并且命令执行完毕会打开 example里面的 xcworkspace。在工程中找到replaceme.m
文件,并替换成你自己的,同时找到 podspec 文件,编辑你所需要的信息,操作完成后,到你的 podfile目录下执行 pod install
这个操作会把你的demo项目和pods进行链接,编译无误后,便可以进行校验。
校验
#import "你的pods文件"
首先import你项目中的文件,如果没有报错,说明基本路径没有问题了,接着就可以进行pod的校验,执行命令
pod lib lint
校验遇到麻烦
如果很不幸,你校验出了问题,比如我在执行的时候就遇到了如下问题
- WARN | summary: The summary is not meaningful.
- ERROR | [iOS] unknown: Encountered an unknown error (Could not find a `ios` simulator (valid values: com.apple.coresimulator.simruntime.ios-10-0, com.apple.coresimulator.simruntime.ios-11-1, com.apple.coresimulator.simruntime.ios-12-2, com.apple.coresimulator.simruntime.tvos-12-2, com.apple.coresimulator.simruntime.watchos-5-2). Ensure that Xcode -> Window -> Devices has at least one `ios` simulator listed or otherwise add one.) during validation.
这个比较好解决,如果你和我一样是Xcode10以上的版本,可能就需要更新下 cocoapods
sudo gem install cocoapods
更新完成cocoapods后,再次进行校验,如果出现如下提示,那么就成功了
HenlyToolKit passed validation.
检查远程spec
pod spec lint
由于我们没有推送上去,此时远程肯定是没有的,检查必然报错
➜ xxxxx git:(master) ✗ pod spec lint
Username for 'http://xxxxx.xxx.com': xxxx
Password for 'http://xxxx@xxxx.xxx.com':
-> xxxxxKit (0.1.1)
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone http://xxxxx.xxx.com /var/folders/s7/nxsncldcnklcnkwdcn_cjsncjdcndjcn_njkdbchdbc/T/s2e923949r-e8r948r-e9i9re --template= --single-branch --depth 1 --branch 0.1.1
Cloning into '/var/folders/s7/cndjcndjcndwjkcn/T/xnjscnjdcnjd-cndkcndjcn-ncjdncjldwnc'...
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'http://http://xxxxx.xxx.com.git/'
) during validation.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
[!] 'xxxxxKit' uses the unencrypted 'http' protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts. Otherwise, please reach out to the library author to notify them of this security issue.
此时我们在用git那所有的代码上传,在进行远程验证
pod repo lint
我枯辽,又双叒叕报错了
➜ xxxxxKit git:(master) pod spec lint
-> xxxxKit (0.1.1)
- ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.
- NOTE | xcodebuild: note: Using new build system
- NOTE | [iOS] xcodebuild: note: Planning build
- NOTE | [iOS] xcodebuild: note: Constructing build description
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
可是,明明本地检测没问题的啊,[iOS] file patterns: The `source_files` pattern did not match any file.
这句就是说,source_files的路径和文件夹不一致,后来找了很久,发现一个捷径
open /Users/xxxxx/Library/Caches/CocoaPods/Pods/External
找到我们的pods,然后手动添加文件夹
当相应文件都做好后,我们在执行一遍指令 pod spec lint
谢天谢地,终于成功了,最后执行上传到我们远程仓库的repo
pod repo push 仓库名称 xxxxKit.podspec
这样,一份私有pod仓库就建立好了
----------更新下,这个操作好像不太稳妥-----------
pod会通过我们写的.podspec文件内的s.source 与 s.source_files两个地址目录去查找对应pod文件,看如下示例:
s.version = '0.1.2' s.source = { :git => >'http://xxxKit', :tag => s.version.to_s } s.ios.deployment_target = '8.0' s.source_files = 'xxxKit/Classes/*.{c,h,hh,m,mm}','xxxKit/Classes/Third/*.{c,h,hh,m,mm}'
pod会去http://xxxKit这个地址的0.1.2 tag下的Classes和Third目录下找所有.h.m文件
解决办法:
每次更新version的时候,push到远程,并且添加tag,tag需要与version保持一致
git add -A && git commit -m "Release 2.0.0"
git tag '2.0.0'
git push --tags
git push origin master
这两条命令是为pod添加版本号并打上tag:
set the new version to 2.0.0
set the new tag to 2.0.0
-------------- 还是失败,我又自闭了-------------
最后参考了大神的博客,终于找到原因
错误分析
s.source_files中描述的为相对路径,但在pod lib lint 与 pod spec lint 时,所用的参照不一样。pod lib lint 时,以podspec文件所在位置为参照;pod spec lint 时,以Git仓库的根目录为参照。
所以,在pod lib lint 时,该s.source_files的描述为源码相对于podspec文件的相对路径,该描述正确;在pod spec lint 时,该s.source_files的描述应为源码相对于Git根目录的相对路径,改描述错误,所以报错。
修复方案:
1、不同的验证方案,使用不同的s.source_files 描述。
pod lib lint 时:s.source_files = "MWBase/BaseModule/**/*.{h,m}"
pod spec lint 时:
s.source_files = "MWBase/MWBase/BaseModule/**/*.{h,m}"
2、推荐方案:移动podspec文件至Git根目录下,并修改内容:
s.source_files = "MWBase/MWBase/BaseModule/**/*.{h,m}"
添加第三方
s.dependency 'DoraemonKit/Core', '~> 1.1.7'
s.dependency 'DoraemonKit/WithLogger', '~> 1.1.7'
s.dependency 'DoraemonKit/WithGPS', '~> 1.1.7'
s.dependency 'DoraemonKit/WithLoad', '~> 1.1.7'