前言
虽然网上有不少Artifactory 搭建CocoaPod私服的文章,但不少文章都缺少步骤,包括官方的文档(官方链接请见文章结尾),导致服务端配置好,本机链接配置、上传、获取等操作不成功;或者本机部署JFrog Artifactory服务,配置、上传、获取也有一些采坑的地方;经与JFrog Artifactory 官方技术人员两天的调试,终于本机部署调试成功,公司测试服务器部署bug解决,故此记录部署过程,也一并记录踩过的坑,让新入手的同学避免再次入坑。
痛点
目前的 CocoaPod 私服,很多公司使用 Git 仓库进行搭建,这导致的问题是,CocoaPod 的构建产出物通常较大,上传到 Git 仓库时,会导致 Git 仓库持续增大, Git Clone 的速度大大降低,进而导致软件部署,交付的时间变长,影响了研发上线的效率。
不仅如此,您可能还需要为安卓的开发者搭建 Gradle 仓库,Java 开发者搭建 Maven 私服,容器团队搭建 Docker 私服,各个私服独立维护,占用大量系统资源,维护成本呈几何指数增长。
JFrog Artifactory 能够解决这个问题,通过搭建 Artifactory,能够在内网建立统一全语言的私有制品仓库,支持 CocoaPod,Gradle,Maven,Docker 等等。程序员通过 Artifactory 可以实现全语言的依赖下载,并且可以将构建产出物上传到 Artifactory 进行管理。
一、选择并创建私服类型,创建入口有两个:
创建入口一:
创建入口二:
建议选择第二重,因为第一种一种类型只能创建一个,第二种,例如local私服,可以创建多个
二、cocoapod-local库的创建
创建完成后,打开并进入设置页面
输入密码后的页面:
三、接下来进入正题,Cocoapod-local 私服的配置、使用、注意点
1、执行下面命令,安装 cocoapod-art 插件
gem install cocoapods-art
2、 打开/Users/用户名/下的.netrc文件(.netrc文件默认是隐藏文件),将弹框中的内容复制添加得到.netrc文件中,
machine 127.0.0.1
login admin
password AKCp5fTjaZcUbhrRdJ1TYdf6xADy2qzmiZBRxokDBD5hhhr6RcWmYj9eZiUWRr2YvPwdBcYQj
坑:一定要用命令行,直接用文本编辑打开,复制粘贴进去,pod install的时候会一直提示 401权限错误,没有得到授权,但双击用文本编辑打开,授权也写了,未起作用。
vim .netrc
在命令行中删除已有并粘贴进去。
3、执行下面命令,等待完成提示出现“Successfully added repo cocoapods-remote”。
pod repo-art add cocoapods-local "http://127.0.0.1:8081/artifactory/api/pods/cocoapods-local"
4、使用下面命令压缩pod包,pod包中包含 项目代码 or framework、boundle,以及.podspec or .podspec.json:
COPYFILE_DISABLE=1 tar czvf 压缩后名称.tar.gz 待压缩文件名称
例如:COPYFILE_DISABLE=1 tar czvf DSCommontEnum-0.1.5.tar.gz DSCommontEnum
.podspec文件示例:
#
# Be sure to run `pod lib lint DSCommontEnum.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
s.name = 'DSCommontEnum'
s.version = '0.1.5'
s.summary = '枚举'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
s.description = <<-DESC
公共的枚举库
DESC
s.homepage = 'http://ip地址/Component-based/DSCommontEnum'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'vvex' => '[email protected]' }
# s.social_media_url = 'https://twitter.com/
s.ios.deployment_target = '8.0'
s.source_files = 'DSCommontEnum/Classes/**/*.h'
#s.dependency 'DSVersionUpdate','0.1.5'
#s.dependency 'AFNetworking','4.0.0'
end
引用库必须是local私服或者Remote私服已有的库,必须是引用外部库示例:
s.dependency 'DSVersionUpdate','0.1.5'
s.dependency 'AFNetworking','4.0.0'
5、使用下面的Artifactory's REST API将 压缩后名称.tar.gz 上传到Local 仓库。
curl -H 'X-JFrog-Art-Api:' -XPUThttp://127.0.0.1:8081/artifactory/cocoapods-local-new/
例如:
curl -H 'X-JFrog-Art-Api:AKCp5ekmsg8hGmnUEXxvAqWNL6MERyoiTLGdjprYhxr3jTkiLE1DE7BHmi7VJ1M5Vequ8KVcs' -XPUThttp://127.0.0.1:8081/artifactory/pods-local/DSCommontEnum/0.1.2/-T /Users/shiqiao/Desktop/test/DSCommontEnum-0.1.2.tar.gz
上传成功截图:
返回Artifactory平台,刷新查看已上传Local私服 私有库信息
6、将 Podfile 中添加该源作为 pod 的依赖解析源。
platform:ios,'8.0'inhibit_all_warnings!#use_frameworks!plugin'cocoapods-art',:sources=>[# 指定local仓库
'cocoapods-local-new'
]target'项目名称'do# 指定pod内容 与 版本号pod'压缩后名称','0.0.1'end
7、执行 pod repo-art update cocoapods-local-new 更新本地索引信息,否则直接执行pod install会提示找不到引用库
8、执行: pod install
四、cocoapod-remote库的创建
五、Remote 仓库使用
1、执行下面命令,安装 cocoapod-art 插件,在 Local 仓库使用过程已经执行,不需要再次执行
gem install cocoapods-art
2、 打开/Users/用户名/下的.netrc文件(.netrc文件默认是隐藏文件),将弹框中的内容复制添加得到.netrc文件中;在 Local 仓库使用过程已经执行,不需要再次执行
machine 127.0.0.1
login admin
password AKCp5fTjaZcUbhrRdJ1TYdf6xADy2qzmiZBRxokDBD5hhhr6RcWmYj9eZiUWRr2YvPwdBcYQj
3、执行下面命令,等待完成提示出现“Successfully added repo cocoapods-remote-news”。
pod repo-art add cocoapods-remote-news "http://127.0.0.1:8081/artifactory/api/pods/cocoapods-remote-news"
注意:这条命令建立索引,比较耗时间,经测试至少需要40分钟以上,需要同步JFrog索引信息如,果瞬间执行完毕,肯定是有问题的;
4、将 Podfile 中添加该源作为 pod 的依赖解析源:
platform:ios,'8.0'inhibit_all_warnings!#use_frameworks!plugin'cocoapods-art',:sources=>['cocoapods-remote-news']target'testProject'dopod'AFNetworking','~> 3.1.0'end
5、执行:pod install 或者 执行不升级CocoaPods的spec仓库的方式。
pod install --verbose --no-repo-update
6、可以看到依赖已经被缓存在远程仓库
六、Local 和 Remote库同时使用
将 Podfile 中添加该源作为 pod 的依赖解析源:
platform:ios,'8.0'inhibit_all_warnings!#use_frameworks!plugin'cocoapods-art',:sources=>['cocoapods-local-new',
'cocoapods-remote-news']target'testProject'dopod'AFNetworking','~> 3.1.0'end
注:如果local库中有依赖 remote中某个库,需要引入 'cocoapods-remote-news',否则pod install 会不成功。
七、注意事项
1、Local仓库使用,将tar.gz上传到Local仓库后,需要注意查看Local仓库tar.gz下,是否包含.DS_Store or ._.DS_Stroe or ._xxxxx等隐藏文件。
.DS_Store是Mac系统保存文件夹自定义属性的隐藏文件,
._xxxxx是压缩过程中出现的
如果包含上述文件,会导致pod install失败。
解决办法:1、在linux系统下压缩为tar.gz,应该没有此问题2、在Windows系统下,使用7-zip工具压缩为tar.gz3、在Mac系统下:(1)删除.DS_Store// 删除当前文件及子文件夹中的.DS_Store文件find.-name'*.DS_Store'-typef-delete(2)压缩COPYFILE_DISABLE=1tar czvf 压缩后名称.tar.gz 待压缩文件名称
2、podspec文件的编写与cocoapods + git的规范完全一致。Podspec Syntax Reference
(1)只需要修改homepage部分,改为四、Local 仓库使用中,第5步,-XPUT与-T之间的地址。
(2)source可以仍为之前cocoapods + git建立私库的地址,podspec上传到local仓库后,Artifactory会将source内容转换成他们自己的地址。(注:经测试source不填写git地址也是可以的,如:spec.source = { :git => "", :tag => "#{spec.version}" })
3、向Local 仓库上传新版本后,需要先执行下面命令,再执行pod install来pod新版本。
pod repo-art update local仓库名称
简单总结:cocoapod-local私服就是团队自己封装的私有库;cocoapod-remote私服就是 github上的开源三方库。
参考链接:
使用Artifactory 1分钟搭建 CocoaPod 私服 :https://blog.csdn.net/wangqingjiewa/article/details/85921419
使用 Artifactory 搭建 CocoaPod 私服:https://www.jianshu.com/p/c06962f56ca8
JFrog 官方链接:https://www.jfrog.com/confluence/display/JFROG/CocoaPods+Repositories
前段时间本人有发布到微信公众号,本人原创链接:https://mp.weixin.qq.com/s/VCwFp9B8ZKoTMq8h8FzCTg