前言
项目私有化目的
项目书写的时候肯定是刚开始比较简单,功能也比较少,模块比较少肯定能满足项目的需求,随着项目模块的增多,项目的代码量也逐渐增加,很有可能会有多人进行开发,提交合并代码会很头痛,模块化给我们一个很好的解决方式,让我们开始吧。
创建私有库 spec repo
spec repo 是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,他实际是一个Git仓库remote端 在GitHub上,但是当你使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的
#~/.cocoapods/repos 大致目录是这样的
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
所以我们需要创建一个类似master结构的spec repo github 私有仓库是收费的, 我选择了Coding 还有其他的服务 像 gitLab、开源中国、Bitbucket、CSDN。
在terminal创建 repos
# pod repo add [Private Repo Name] [HTTPS clone URL]
$ pod repo add WMCommon https://git.coding.net/fufu62/WSPCommon.git
此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到WMCommon这个目录了。至此第一步创建私有Spec Repo完成。
创建 podspec 文件
已经有了现成的项目,需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,官方文档在这里
在本地项目目录下创建
$ pod spec create WPCommon
执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。
Pod::Spec.new do |s|
s.name = "WPCommon"
s.version = "0.2"
s.summary = "the project for WPCommon"
s.homepage = "https://git.coding.net/fufu62/WSPCommon.git"
s.license = "MIT"
s.author = { "ISPWang" => "sanpeng123@126.com" }
s.platform = :ios, "7.1"
s.ios.deployment_target = "7.1"
s.source = { :git => "https://git.coding.net/fufu62/WSPCommon.git", :tag => "0.1" }
s.source_files = "CommonTest/CommonTest/Mine/Controller/**/*.{h,m}"
s.frameworks = "UIKit"
s.requires_arc = true
end
# 编辑完成之后使用验证命令验证一下
$ pod lib lint
WPCommon passed validation. #验证无错误
# 可以进入下一步了。没有验证过去 根据错误提示进行修改 podspec文件
本地测试pod spec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
platform :ios, '7.1'
pod ‘WPCommon', :path => ‘~/Code/WSPCommon/CommonTest' # 指定路径
pod 'WPCommon ', :podspec => '~/Code/WSPCommon/CommonTest/WPCommon.podspec'
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/WPCommon中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。
在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。
提交步骤
# 提交代码
git add -A && git commit -m "Release 0.1"
# 打tag
git tag -m “new version” ‘0.1'
# 把tag推到远程仓库
git push --tags
# 将本地的master分支推送到远程仓库
git push origin master
向Spec Repo提交pod spec
向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令
$ pod repo push WMCommon WPCommon.podsepc #前面是本地Repo名字 后面是pod spec名字
完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/WTSpecs目录下查看
.
├── LICENSE
├── WPCommon
│ └── 0.1
│ └── WPCommon.podspec
└── 0.2
│ └── WPCommon.podspec
└── README.md
再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。
pod search WPCommon
-> WPCommon (0.2)
A short test for of WPCommon.
pod 'WPCommon', '~> 0.2'
- Homepage: https://git.coding.net/fufu62/WSPCommon.git
- Source: https://git.coding.net/fufu62/WSPCommon.git
- Versions: 0.2, 0.1 [WMCommon repo]
使用制作好的Pod
在Pod file 文件里增加私有库文件即可
source 'https://github.com/CocoaPods/Specs.git'
source 'https://git.coding.net/fufu62/WSPCommon.git'
platform:ios,’8.0’
target "cocoapodsTest" do
pod 'MJRefresh'
pod 'SDWebImage', '~> 3.8.1'
pod 'WPCommon', '~> 0.2'
end
# 快速更新状态
pod update --no-repo-update
中间会出现警告
—no-clean
或者error ?
Assuming you are using git for that repo, can you run git status? If the repo is clean it would say something like nothing to commit, working directory clean.
Sorry, can you run git status --porcelain, that’s the exact command it runs
pod repo push WMCommon WMCommon.podspec --allow-warnings --verbose
// --allow-warnings : 允许 警告,有一些警告是代码自身带的。
// --use-libraries : 私有库、静态库引用的时候加上
// —verbose : lint显示详情
框架中如果使用Xib加载crash的情况
出现通过mainBundle加载不了,无法获取Xib
[NSBundle bundleForClass:[self class] 获取bundle
// 这样之后,无论是通过copy文件夹方式还是CocoaPods下载安装的方式,都能正常使用xib进行初始化了
CocoaPods下载框架中图片无法正常显示通过ImageName
- 通过CocoaPods下载安装,如果xib中直接填写好的图片,则图片资源能直接显示,如果通过代码"[UIImage imageNamed:@""]"去设置的话,则图片资源根本显示不了
//改变代码图片路径
// 图片路径
#define WMCommonSrcName(file) [@"WMCommon.bundle" stringByAppendingPathComponent:file]
#define WMCommonFrameworkSrcName(file) [@"Frameworks/WMCommon.framework/WMCommon.bundle" stringByAppendingPathComponent:file]
WMCommonSrcName(file) 为通过copy文件夹方式获取图片路径的宏
WMCommonFrameworkSrcName(file) 为通过cocoapods下载安装获取图片路径的宏
之后修改代码中设置图片的方式如下:
UIImage *img = [UIImage imageNamed:WMCommonSrcName(@"image.png")]?:[UIImage imageNamed:WMCommonFrameworkSrcName(@"image.png")];
参照
使用Cocoapods创建私有pod spec
iOS CocoaPods 私有库 steps and tips
CocoaPods 详解之——更新篇
iOS移动端架构的那些事