思路:创建一个是远程私有spec仓库与本地私有spec仓库,也就是两个检索库,其他的和远程仓库没有太大的区别,区别是比远程公有仓库多两个检索库
总体内容
- 1、创建 远程私有Spec仓库与本地 Spec Repo检索库
- 2、创建Pod私有库所需要的项目工程文件,并上传到私有仓库
- 3、创建Pod所对应的podspec文件, 并进行验证/测试
- 4、创建JKCIOBase版本,并提交代码代码到JKCIOBase的远程仓库
- 5、向私有的Spec Repo中提交podspec和远程私有spec仓库提交
- 6、使用pod库来测试远程私有库的使用
- 7、远程私有库与其他公有的混合使用
- 8、远程私有库分支
- 9、远程私有库添加依赖库
- 10、资源文件
.buldle
的添加 - 11、远程私有库内容更新
- 12、fastlane 自动化更新pod库
- 13、其他组内成员如何使用?
一、创建 远程私有Spec仓库与本地 Spec Repo检索库,远程的spec文件存在码云的私有仓库
- 1.1、在 码云 创建私有的spec仓库,取名为JKCIOSpecs,一定要选择私有,不然谁都可以看到就没有什么意义了
- 1.2、在本地添加一个spec仓库
-
(1)、查看本地spec路径
pod repo
-
(2)、查看帮助信息,可以看到能够添加本地spec仓库的提示
pod repo --help
-
(3)、开始在本地添加spec仓库
具体的代码如下: JKCIOBase是本地spec仓库的名字,名字你自己可以随意取,[email protected]:JKWC/JKCIOSpecs.git
是我们上面在码云创建的远程spec仓库的ssh
路径,本地和远程关联起来pod repo add JKCIOBase [email protected]:JKWC/JKCIOSpecs.git
添加后的效果如下
command + shift +G 输入 ~/.cocoapods/repos
-
提示:如果你的公钥与私钥没有配置,那就设置下,在终端输入下面的代码,之后最后出现下图
ssh-keygen
- 去电脑上的 个人->
.ssh
文件夹里面复制id_rsa.pub
的内容到码云(在码云个人设置里面添加公钥),也可以使用快捷键:command + shift +G 输入 ~/.ssh
进入到 ssh文件里面
- 小提示:
.ssh
是隐藏文件,可以用command+shift+.
让隐藏文件显示出现,复制完记得再次输入command+shift+.
让隐藏文件关闭,切记不要轻易删除任何隐藏文件
-
-
(4)、查看添加后的效果,在终端输入下面代码
pod repo
-
二、创建Pod私有库所需要的项目工程文件(我们还在码云创建)
-
2.1、我在码云创建的CIO时代的基础组件与功能组件库:
JKCIOBase
-
2.2、把
JKCIOBase
克隆到本地,创建一个文件夹JKRemoteLocal
# 1、 cd导入路径 cd 进入到JKRemoteLocal文件夹 # 2、git clone 仓库到本地:clone自己仓库的地址 git clone https://gitee.com/JKWC/JKCIOBase.git
-
2.3、在本地
JKRemoteLocal/JKCIOBase
文件夹里面创建一个JKCIOBase
文件夹,同时创建一个JKCIOBaseDemo
项目,与刚才创建的JKCIOBase同一个目录
-
2.4、在与JKCIOBaseDemo 同级的文件夹JKCIOBase里面,我又创建了一个文件夹JKCategory,里面拖入了一个UIView的分类
UIView+JKLayout
三、创建Pod所对应的podspec文件, 并进行验证
-
3.1、在与JKCIOBaseDemo同目录下创建文件
JKCIOBase.podspec
cd 进入到JKCIOBase
提示:JKCIOBase 是第一个文件夹,也就是 JKCIOBase与JKCIOBaseDemo所在的文件夹
-
3.2、创建spec文件
pod spec create JKCIOBase
-
3.3、修改spec文件,下面是我修改的内容
Pod::Spec.new do |s| s.name = "JKCIOBase" s.version = "0.0.2" s.summary = "JKCIOBase." s.description = "JKCIOBase是CIO时代的基础组件,后续还会继续增加" s.homepage = "https://gitee.com/JKWC/JKCIOBase" s.license = "MIT" s.author = { "JoanKingWC" => "[email protected]" } s.ios.deployment_target = "8.0" s.source = { :git => "https://gitee.com/JKWC/JKCIOBase.git", :tag => "#{s.version}" } s.source_files = 'JKCIOBase/**/*.{h,m}' s.requires_arc = true end
提示:
1、s.summary
要比s.description
短
2、s.homepage
写JKCIOBase在码云的首页
3、s.source
写JKCIOBase
的代码地址即可
4、s.source_files
不要写错,这里的路径是以 spec所在的目录开始寻找的,也就是以JKCIOBase.podspec
所在的目录开始寻找, JKCIOBase与JKCIOBase.podspec
同级目录,取JKCIOBase下所有文件夹与.h
和.m
文件s.source_files = 'JKCIOBase/**/*.{h,m}' // ** 代表所有文件
5、如果依赖什么库,就写上依赖,如下,依赖 sqlite3,代码如下
s.library = "sqlite3"
-
3.4、远程验证spec文件是否符合规则
pod spec lint JKCIOBase.podspec
提示:如果报错就看下我在远程公有库博客里面对于验证spec文件有问题的处理
四、创建JKCIOBase版本,并提交代码代码到JKCIOBase的远程仓库
-
4.1、
cd JKCIOBase.podspec
所在的目录cd JKCIOBase.podspec所在的目录
-
4.2、创建版本 tag: 要与
JKCIOBase.podspec
里面的版本号保持一致git tag '0.0.1'
-
4.3、提交版本号
git push origin 0.0.1
-
提示:如果你提交tag失败了,请关联仓库,后面加你的仓库地址,切记是代码仓库地址,不是远程spec仓库地址
git remote add origin https://github.com/JoanKing/JKCIOBase.git
-
如果我们想推送到其他的分支,可以移除之前的分支,假如我们自己的分支叫
feature
,那么查看是不是feature
,如果不是就删除掉,有关这一点不懂的可以下方评论// 查看当前的分支 git branch // 查看自己的remote端名字 git remote -v // 如果不是我们的分支,删除之前的 分支名 项目关联,下面以 origin 为例 git remote rm origin // 添加关联 git remote add feature https://github.com/JoanKing/JKGCDTimer.git
-
-
4.4、提交本地JKCIOBase的内容
打开Xcode,在Source Control
里面commit
选择同时提交到远程JKCIOBase
仓库
五、向私有的Spec Repo中提交podspec和远程私有spec仓库提交
-
5.1、在
三
里面我们已经验证过 spec文件是符合规定的,向私有的Spec Repo中提交 spec文件pod repo push JKCIOBase JKCIOBase.podspec
在此提示:JKCIOBase 是 私有本地私有 spec 索引库的名字,JKCIOBase.podspec 是我们要推送的索引文件
提示:如果你在验证的时候有警告,只要没有报错可以加上
--use-libraries --allow-warnings
,如下:pod repo push JKCIOBase JKCIOBase.podspec --use-libraries --allow-warnings
-
5.2、我们验证下是否成功
进入本地 JKCIOBase 仓库,上面的没有报错,在JKCIOBase里面出现JKCIOBase仓库就是成功了,JKCIOBase里面会存着每个版本的spec文件,这里展示了
0.0.2
版本的spec
文件command + shift +G 输入 ~/.cocoapods/repos
-
5.3、远程私有spec仓库提交
其实写这个5.3是多余的,因为在5.2里面,我们把spec文件提交到本地的时候,同时也就提交到了我们创建的远程 spec仓库,也就是我们在1.1
创建的JKCIOSpecs
,我们看下JKCIOSpecs
里面,存放也是spec的各个版本,如下图
六、使用pod库来测试远程私有库的使用
6.1、在桌面创建一个项目
JKRemoteLocalTest
-
6.2、创建Podfile文件
cd JKRemoteLocalTest文件夹 pod init
-
6.3、修改 Podfile文件的内容
source '[email protected]:JKWC/JKCIOSpecs.git' platform :ios, '9.0' target 'JKRemoteLocalTest' do use_frameworks! pod 'JKCIOBase' end
提示:
source '[email protected]:JKWC/JKCIOSpecs.git'
是远程spec仓库的地址,不可少,因为pod 'JKCIOBase'
是要从 source资源里面去找spec文件来下载相应的版本的 JKCIOBase -
6.4、查看导入的效果
七、远程私有库与其他公有的混合使用
-
7.1、如下 Podfile文件 内容,导入
SDWebImage
是不会成功的source '[email protected]:JKWC/JKCIOSpecs.git' platform :ios, '9.0' target 'JKRemoteLocalTest' do use_frameworks! pod 'JKCIOBase' pod 'SDWebImage' end
-
7.2、解决
7.1
导入SDWebImage
不成功的问题-
分析 SDWebImage 是属于pod 公有库的资源,在
source '[email protected]:JKWC/JKCIOSpecs.git'
是不可能找到的,所以要在公有库的资源里面寻找,查看公有库资源路径pod repo
-
如下写 Podfile 文件才是正确的
source '[email protected]:JKWC/JKCIOSpecs.git' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' target 'JKRemoteLocalTest' do use_frameworks! pod 'JKCIOBase' pod 'SDWebImage' end
-
-
-
7.3、查看导入远程私有库与公有库的效果
八、远程私有库分支
- 8.1、这个有关分支的问题,我在远程共有库已经阐述过了这里我就在
JKCIOBase
添加一个JKKit
- 8.2、在spec文件里面设置一下
JKCategory
与JKKit
分支的东西
-
8.3、把版本改为
0.0.6
,打tag提交代码如下# cd 进入spec所在的目录 cd 进入 JKCIOBase所在的目录,也就是spec文件所在的目录 # 打0.0.6的tag git tag '0.0.6' # 提交 tag到 远程私有仓库 git push origin 0.0.6 # 使用xcode提交代码到远程仓库
-
8.4、提交spec文件到本地私有spec仓库(也就是我们创建的JKCIOBase)
pod repo push JKCIOBase JKCIOBase.podspec --use-libraries --allow-warnings
-
8.5、在使用
command + shift +G 输入 ~/.cocoapods/repos
里面的JKCIOBase
就可以看到里面多了一个新的版本,我这里提交的是0.0.6
-
8.6、测试一下是否设置分支成功
cd 进入上面测试`JKRemoteLocalTest` # 更新库 pod update
九、远程私有库添加依赖库
- 9.1、给
JKCIOBase
添加依赖库'AFNetworking'
与'MJRefresh'
,给JKKit
添加一个依赖库Masonry
- 9.2、打tag,提交spec等等和
八
里面的一样,不再写了 - 9.3、查看是否依赖第三方库成功。同样更新
JKRemoteLocalTest
十、资源文件 .buldle
的添加
- 10.1、什么是Bundle文件?
答:简单理解,就是资源文件包。我们将许多图片、XIB、文本文件组织在一起,打包成一个Bundle文件。方便在其他项目中引用包内的资源。 - 10.2、Bundle文件的特点?
答:Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。 - 10.3、bundle的优点
- (1)、因为bundle在目录结构中的层次结构,一个bundle只包含资源文件。因此,你可以使用相同的文件接口像打开其他类型文件一样打开bundle文件
- (2)、bundle的结构使它可以很容易的支持本地化,你可以非常容易的添加或者移除本地资源
- (3)、bundle可以保持在多种格式的的系统中, 如HFS,HFS+和AFP的multiple fork formats;UFS,SMB,NFS 的single-fork formats
- 10.4、我们创建一个
JKCIOBase.bundle
的资源文件-
<1>、新建一个工程macOS的Bundle项目
-
<2>、命名为:JKCIOBase.bundle
-
<3>、删除文件夹和info.plist文件
-
<4>、删除Build Settings里的Packaging的info.plist的文件地址
-
<5>、设置 Base SDK 为 iOS
<6>、把
Build Active Architecture Only
修改为NO
,否则生成的库就只支持当前选择设备的架构-
<7>、bundle中的图片格式修改
iOS 创建Bundle时放入的图片资源(.png)在默认配置下会被转为.tiff格式,使用的时候找不到。因为在iOS中创建bundle时会用一个“hack”,为了使所有的运行需要更改一个配置。找到bundle的工程,修改:Buld Settings >
COMBINE_HIDPI_IMAGES
为NO
-
<8>.可选配置
作为资源包,仅仅需要编译就好,无需安装相关的配置,设置Skip Install
为YES
,清除Installation Directory
路径信息。 -
<9>、最关键是把工程目录下的
Build Settings
下Code Signing Identity
的苹果研发者证书换成 iOS研发者证书 -
<10>.添加要打包的资源文件进到文件夹,编译
-
<11>、进入到
JKCIOBase.bundle
-
<12>、把
JKCIOBase.bundle
复制到其他的iOS项目 -
<13>、图片的使用
-
第一种直接拖入项目使用,取路径如下
-
OC
"JKCIOBase.bundle/icon_scan"
加载图片
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 40, 40)]; imageView.image = [UIImage imageNamed:@"JKCIOBase.bundle/icon_scan"] [self.view addSubview:imageView];
-
Swift
let path = Bundle.init(for: ViewController.self).path(forResource: "Frameworks/xcrbasekit.framework/xcrbasekit", ofType: "bundle") let bundle = Bundle.init(path: path!) let image = UIImage.init(named: "xbb_bigV", in: bundle, compatibleWith: nil) let userImageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100)) userImageView.image = image view.addSubview(userImageView)
-
对于上面参数的理解
let path = Bundle.init(for: #className.self).path(forResource: "#bunleName", ofType: "bundle") let bundle = Bundle.init(path: path!) let image = UIImage.init(named: "#pageName", in: bundle, compatibleWith: nil)
className:bundle所在的类的类名
bunleName:bundle名称
pageName:要使用的图片名称
-
-
-
第二种封装成SDK再使用,取路径如下
-
OC
"Frameworks/JKOCProjectTool.framework/JKCIOBase.bundle/icon_scan"
加载图片
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 40, 40)]; imageView.image = [UIImage imageNamed:@"Frameworks/JKOCProjectTool.framework/JKCIOBase.bundle/icon_scan"] [self.view addSubview:imageView];
-
Swift,取资源调用
<14>
里面的函数let userImageView = UIImageView(frame: CGRect(x: 100, y: 100, width: 100, height: 100)) userImageView.image = UIImage(named: getBundleResource(bundName: "xcrbasekit", resourceName: "xbb_bigV", bundleType: 1)) view.addSubview(userImageView)
-
-
-
<14>、把图片路径封装成宏
-
OC
#define JKOCProjectToolBundlePath(file) [@"JKOCProjectTool.bundle" stringByAppendingPathComponent:file] #define JKOCProjectToolFrameworkBundlePath(file) [@"Frameworks/JKOCProjectTool.framework/JKOCProjectTool.bundle" stringByAppendingPathComponent:file] #define JKOCProjectToolBundleImageName(file) [UIImage imageNamed:JKOCProjectToolBundlePath(file)] ? :[UIImage imageNamed:JKOCProjectToolFrameworkBundlePath(file)]
-
Swift 写成函数
/// 获取资源文件 /// - Parameter bundName: bundle的名字 /// - Parameter resourceName: 资源的名字,比如图片的名字 /// - Parameter bundleType: 类型:默认 0 是在自己模块下使用,1 在其他模块中使用 func getBundleResource(bundName: String,resourceName: String,bundleType: Int = 0) -> String { if bundleType == 1 { return "Frameworks/\(bundName).framework/\(bundName).bundle/\(resourceName)" } return "\(bundName).bundle/" + "\(resourceName)" }
-
-
十一、远程私有库内容更新
远程私有库内容更新的更新其实和八
里面一样的步骤,修改JKCIOBase里面的内容,更改spec内的版本号,有要修改的就修改内容,打版本tag,提交tag到远程私有仓库,提交spec文件打破本地spec仓库与远程私有spec检索仓库
十二、fastlane 自动化更新pod库
12.1、什么是自动化?
答:通过简单的一条命令, 去自动执行一组固定操作,比如:测试、打包上传审核、分发 等自动化使用场景12.2、Fastlane 简介
Fastlane是一个ruby脚本集合-
12.3、Fastlane使用概念
-
lane
(航道) : 好比一道题 -
Action
机制:好比做一道题分很多步,每一步都是一个 Action,专业的解释:Action是Fastlane自动化流程中的最小执行单元,体现在Fastfile脚本中的一个个命令,比如:cocoapods
、git_add
等等,而这些命令背后都对应一个用Ruby
编写的脚本。 - 目前所有的 Action: Actions描述链接、源码链接
- 常用action:
-
produce
创建可用于 iTunes Connect 和 Apple Developer Portal 的 iOS app。 -
cert
自动创建和维护 iOS 代码签名证书。 -
sigh
创建、更新、下载和修复 provisioning profiles。 -
snapshot
自动将 App 屏幕截图本地化到每种设备上。 -
frameit
将屏幕截图适配到适当的设备屏幕大小。 -
gym
创建和打包 iOS app。 -
deliver
上传屏幕截图、元数据和 App 到 App 商店。 -
PEM
自动创建和更新 Push 通知的 profile。
-
-
-
12.4、Fastlane 安装
sudo gem install fastlane sudo gem install -n /usr/local/bin fastlane
提示:要求ruby版本最新
brew update brew install ruby
- 提示:如果报错:
-bash: brew: command not found
- 解决上面报错的方法:mac 终端下,执行以下命令,即可安装brew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 在终端环境下,
brew --version
查看brew的版本,也可以验证brew是否安装成功
- 提示:如果报错:
-
12.5、在项目使用 Fastlane
<1>、在终端 cd 进入项目根目录
-
<2>、
fastlane init
- (1)、自动截图
- (2)、✈️自动测试分发到TestFlight
- (3)、自动化App Store分发
- (4)、手动设置 - 手动设置项目以自动执行任务
提示1:看自己的需求,我这里选的4
提示2:如果不需要实现上传等操作, 其实我们可以直接在工程目录下, 创建一个fastlane
文件夹, 在文件夹内部创建"使用文件"(Fastfile
文件),在成功后fastlane
文件夹里面会有一个Fastfile
文件 -
<3>、 在fastlane 文件夹里面的 Fastfile 文件中, 描述不同的"航道",我们这里以下面的步骤为主
提示:在代码转化为 action的过程都是在 Actions描述 里面查找的
-
(1)、提交代码到本地暂缓区,
git add .
,对应的fastlane 命令如下git_add(path: ".")
提示:
.
代表当前文件下所有的内容 -
(2)、提交代码到本地仓库,
git commit -m '提交内容说明'
,对应的fastlane 命令如下,提交说明的信息,我们可以定义成参数传进来git_commit(path: ".", message: "提交代码")
-
(3)、提交代码到远程仓库,
git push origin master
,对应的fastlane 命令如下push_to_git_remote
-
(4)、给版本打tag,
git tag 版本号
,对应的fastlane 命令如下add_git_tag( tag: 版本号 )
提示:版本号我们传进来
-
(5)、提交所有的版本
git push --tags
,对应的fastlane 命令如下push_git_tags
-
(6)、删除指定tag: 本地删除
git tag -d 0.0.1
,远程删除:git push origin :0.0.1
,对应的fastlane 命令如下remove_tag(tag:版本号)
-
(6)、验证spec文件是否有报错,允许有警告,
pod spec lint --allow-warnings
,对应的fastlane 命令如下pod_lib_lint(allow_warnings: true)
-
(7)、如果你在验证的时候有警告,只要没有报错可以加上 --use-libraries --allow-warnings就可以提交:
pod repo push 本地私有库名 组件名.podspec --use-libraries --allow-warnings
,,对应的 fastlane 命令如下pod_push(path: "#{组件名}.podspec", repo: "本地库名", allow_warnings: true)
-
(8)、
pod install
对应的 fastlane 命令如下cocoapods( clean: true, podfile: "." )
提示:podfile后面的路径是以 fastlane文件夹为准需要 Podfile 文件的,如果Podfile与fastlane文件夹同目录,那么就写:podfile: ".",其中
.
代表当前目录
-
-
12.6、fastlane文件夹下Fastfile文件的命令完整的步骤如下:
default_platform(:ios) platform :ios do desc "pod远程提交" lane :custom_lane do |options| # 参数一:提交代码的备注 commit_message = options[:message] # 参数二:版本号 commit_tagName = options[:tagName] # 参数三:spec 文件的名字 commit_specName = options[:specName] # 参数四:仓库的本地检索库的名字 commit_repositoryName = options[:repositoryName] # 1、提交代码到本地暂缓区 git_add(path: ".") # 2、提交代码到本地仓库 git_commit(path: ".", message: "#{commit_message}") # 3、提交代码到远程仓库 push_to_git_remote # 4、验证tag是否存在,如果存在, 应该删除本地标签和远程标签 # 如果判断标签是否存在 if git_tag_exists(tag: commit_tagName) UI.message("发现tag:#{commit_tagName} 已经存在, 即将执行, 删除动作 ") # 执行删除本地/远程标签 remove_tag(tag:commit_tagName) end # 5. git tag 标签名称 add_git_tag( tag: commit_tagName ) # 6. 提交tag到服务器 git push --tags push_git_tags # 7. 验证spec文件是否有问题 pod_lib_lint(allow_warnings: true) # 8. 推送 spec 文件到本地和服务器 pod_push(path: "#{commit_specName}.podspec", repo: "#{commit_repositoryName}", allow_warnings: true) end end
使用方式:把fastlane文件夹拖到和spec文件同一目录下,cd 进入 spec 文件所在的目录,执行下面的命令
命令:
fastlane custom_lane message:提交内容说明 tagName: 版本号 specName: spec文件名字 repositoryName: 仓库名字
提示:一定要有 fastlane文件夹,里面有Fastfile文件
十三、其他组内成员如何使用?
-
13.1、分配权限给同事
把创建的远程代码私有库以及远程spec私有库都添加你同事进来,让他注册码云账号,添加这两个远程私有库
13.2、添加本地私有库
重复一 里面的 1.2
在本地添加一个spec仓库-
13.3、配置Podfile文件
远程公有库
本地私有库