基于cocoaPods 1.2.1, Xcode8.3;
借助MJRefresh作为示例展示:
参考:
Cocoapods 入门
如何编写一个CocoaPods的spec文件
CocoaPods 私有仓库的创建
用CocoaPods做iOS程序的依赖管理
一.首先获取MJRefresh源码
在GitHub 克隆(clone)或下载(download MJRefresh)的源码。克隆会获取连同.git在内的所有文件;下载只下载对应分支的文件,不包含.git文件;
1.使用Xcode,打开Xcode,选择Check out an existing project
后输入https://github.com/CoderMJLee/MJRefresh.git,点击next后选择保存路径下载成功即可。
2.使用命令行
//打开Desktop文件夹
$ cd /Users/thinkjoy/Desktop
//使用git的clone命令获取文件
$ git clone https://github.com/CoderMJLee/MJRefresh.git
下载中.png
下载完成.png
二.创建私有版本库repos
1.在码云上创建一个远程版本库
创建私有版本库1.png创建私有版本库2.png
2.将创建的远程版本库添加到本地
$ pod repo add MyRepos https://git.oschina.net/ruishengDu/MyRepos.git
在Finder前往~/.cocoapods/repos
文件夹查看,如图新增MyRepos
文件夹;
3.创建代码库,并clone到本地
在码云上创建代码库,并clone到本地;
$ cd /Users/thinkjoy/Desktop
$ git clone https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git
创建代码库
4.导入代码文件,编写.podspec
文件
将clone的MJRefresh文件夹的MJRefresh文件夹拷贝到MJRefreshPodsTest文件夹内,如图:
clone的MJRefresh文件目录
其中.podspec
文件是代码库的pod描述文件,通过pod命令行创建:
$ cd /Users/thinkjoy/Desktop/MJRefreshPodsTest
$ pod spec create MJRefreshPodsTest
运行命令行后,可在MJRefreshPodsTest目录下看到MJRefreshPodsTest.podspec
文件,打开如下(添加部分注释):
#
# Be sure to run `pod spec lint MJRefreshPodsTest.podspec' to ensure this is a
# valid spec and to remove all comments including this before submitting the spec.
#
# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
#
Pod::Spec.new do |s|
# ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# These will help people to find your library, and whilst it
# can feel like a chore to fill in it's definitely to your advantage. The
# summary should be tweet-length, and the description more in depth.
#
s.name = "MJRefreshPodsTest" #项目名称
s.version = "0.0.1" # 版本号
s.summary = "A short description of MJRefreshPodsTest." #项目简介,pod search命令就是根据s.name和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://EXAMPLE/MJRefreshPodsTest" #代码仓库主页
# s.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
# ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Licensing your code is important. See http://choosealicense.com for more info.
# CocoaPods will detect a license file if there is a named LICENSE*
# Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'.
#
# 开源授权版本,建议使用下面的,检查代码库中是否有FILE_LICENSE文件,默认创建的是LICENSE,直接用LICENSE替代FILE_LICENSE
s.license = "MIT (example)"
# s.license = { :type => "MIT", :file => "FILE_LICENSE" }
# ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Specify the authors of the library, with email addresses. Email addresses
# of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also
# accepts just a name if you'd rather not provide an email address.
#
# Specify a social_media_url where others can refer to, for example a twitter
# profile URL.
#
s.author = { "肉身佛陀94" => "1**********@139.com" } #作者信息
# Or just: s.author = "肉身佛陀94"
# s.authors = { "肉身佛陀94" => "1**********@139.com" }
# s.social_media_url = "http://twitter.com/肉身佛陀94" #作者主页
# ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# If this Pod runs only on iOS or OS X, then specify the platform and
# the deployment target. You can optionally include the target after the platform.
#
# s.platform = :ios
# s.platform = :ios, "5.0" #平台及最低支持版本
# When using multiple platforms,当使用多个平台,分别设置支持的最低版本
# s.ios.deployment_target = "5.0"
# s.osx.deployment_target = "10.7"
# s.watchos.deployment_target = "2.0"
# s.tvos.deployment_target = "9.0"
# ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Specify the location from where the source should be retrieved.
# Supports git, hg, bzr, svn and HTTP.
#
s.source = { :git => "http://EXAMPLE/MJRefreshPodsTest.git", :tag => "#{s.version}" } #代码仓库地址,#{s.version}是对应版本的Tag标签名,如Tag标签名与版本号不一致,需修改为Tag标签名;例:版本号为“0.0.1”,Tag标签为“V0.0.1”,就需要修改为V0.0.1;
# ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# CocoaPods is smart about how it includes source code. For source files
# giving a folder will include any swift, h, m, mm, c & cpp files.
# For header files it will include any header in the folder.
# Not including the public_header_files will make all headers public.
#
s.source_files = "Classes", "Classes/**/*.{h,m}" #代码的位置, 前一部分Classes/**/是一个相对目录,目录的层级关系一定要跟代码库的保持一致。最后一部分*.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件
s.exclude_files = "Classes/Exclude"
# s.public_header_files = "Classes/**/*.h"
# ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# A list of resources included with the Pod. These are copied into the
# target bundle with a build phase script. Anything else will be cleaned.
# You can preserve files from being cleaned, please don't preserve
# non-essential files like tests, examples and documentation.
#
# s.resource = "icon.png"
# s.resources = "Resources/*.png" #资源文件(如图片等)
# s.preserve_paths = "FilesToSave", "MoreFilesToSave"
# ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# Link your library with frameworks, or libraries. Libraries do not include
# the lib prefix of their name.
#
# s.framework = "SomeFramework"
# s.frameworks = "SomeFramework", "AnotherFramework" #依赖iOS的framework
# s.library = "iconv"
# s.libraries = "iconv", "xml2" #依赖iOS的library
# ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #
#
# If your library depends on compiler flags you can set them in the xcconfig hash
# where they will only apply to your library. If you depend on other Podspecs
# you can include multiple dependencies to ensure it works.
# s.requires_arc = true #是否支持ARC
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# s.dependency "JSONKit", "~> 1.4" #依赖于其他的第三方库
end
删掉注释后最终结果如下:
Pod::Spec.new do |s|
s.name = "MJRefreshPodsTest"
s.version = "0.0.1"
s.summary = "根据MJRefresh作为源码的pods私有库测试"
s.description = <<-DESC
根据MJRefresh作为源码的pods私有库测试
DESC
s.homepage = "http://git.oschina.net/ruishengDu/MJRefreshPodsTest" #代码仓库主页
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = "肉身佛陀94"
s.platform = :ios, "8.0" #平台及最低支持版本
s.source = { :git => "https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git", :tag => "#{s.version}" }
s.source_files = "MJRefresh", "MJRefresh/**/*.{h,m}"
s.resource = 'MJRefresh/MJRefresh.bundle'
s.requires_arc = true #是否支持ARC
end
配置完成后,我们需要验证下 .podspec 文件的格式正确性,在终端输入
$ cd /Users/thinkjoy/Desktop/MJRefreshPodsTest
$ pod lib lint
运行结果可能会有以下警告:
-
- WARN | description: The description is equal to the summary.
description和summary相同,修改后即可; -
- WARN | summary: The summary is not meaningful.
summary使用的是默认值; -
- WARN | description: The description is shorter than the summary.
description比summary短; -
- WARN | url: The URL (http://git.oschina.net/ruishengDu/MJRefreshPodsTest) is not reachable.
地址无法访问,原因不知道,可以使用$ pod lib lint --private
或$ pod lib lint --allow-warnings
忽略警告; -
[!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a '.swift-version'file to set the version for your Pod. For example to use Swift 2.3, run: 'echo "2.3" > .swift-version'. You can use the '--no-clean' option to inspect any issue.
未设置默认支持Swift版本,可以使用$ echo "3.0" > .swift-version
命令设置,运行后MJRefreshPodsTest
目录下会生成一个.swift-version
隐藏文件;
成功后会有MJRefreshPodsTest passed validation.
的提示;
4.将本地MJRefreshPodsTest
目录下的文件推到远程代码库
执行命令:
$ cd /Users/thinkjoy/Desktop/MJRefreshPodsTest
$ git add .
$ git commit -m '0.0.1完成'
$ git push https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git
$ git tag -a 0.0.1 -m 'V0.0.1'
$ git push --tags
完成后,远程版本库如下图:
远程代码库
5.将代码中的pod描述文件推送到版本仓库
执行命令:
$ pod repo push MyRepos MJRefreshPodsTest.podspec
成功后通过~/.cocoapods/repos/MyRepos
查看,新增的版本库中已添加MJRefreshPodsTest的描述信息,如图:
MyRepos
远程版本仓库中同样已添加MJRefreshPodsTest的描述信息,如图:
此时,我们可以在pod 中搜索MJRefreshPodsTest,点击键盘的Q键
退出pod search
命令
$ pod search MJRefreshPodsTest
-> MJRefreshPodsTest (0.0.1)
根据MJRefresh作为源码的pods私有库测试
pod 'MJRefreshPodsTest', '~> 0.0.1'
- Homepage: http://git.oschina.net/ruishengDu/MJRefreshPodsTest
- Source: https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git
- Versions: 0.0.1 [MyRepos repo]
(END)
三.私有版本库的使用
我们在桌面上创建一个名为PodTest
的OC
工程,在工程目录下创建并编辑好podflie
文件,podflie
如下:
source 'https://git.oschina.net/ruishengDu/MyRepos.git' #远程仓库地址
platform :ios, '8.0'
inhibit_all_warnings!
target 'PodTest' do
pod ‘MJRefreshPodsTest’ #我们的私有库
end
执行命令行:
$ cd /Users/thinkjoy/Desktop/PodTest
$ pod install
运行成功后,PodTest工程目录如下:
PodTest工程目录通过.xcworkspace文件
打开项目,查看Pods目录,MJRefreshPodsTest中包含所有我们上传的代码,如图:
此时,MJRefreshPodsTest
已添加到项目中,但是直接使用#import "***.h"
引用头文件没有提示,方法如下:
- 可以使用
#import <MJRefreshPodsTest/***.h>
引用头文件; - 在
Target -> Build Settings ->User Header Search Paths
条目中,添加${SRCROOT}
或者$(PODS_ROOT)
,并且选择Recursive;
四.在项目中移除CocoaPods三方库配置文件
- 删除工程中的
Podfile文件
、Podfile.lock文件
、.xcworkspace文件
和Pods文件夹
; - 删除
Target -> Build Settings ->Link Binary With Libraries
中的libPods-工程名.a
文件; - 删除
Target -> Build Settings
中的[CP] Check Pods Manifest.lock
、[CP] Embed Pods Frameworks
和[CP] Copy Pods Resources
选项; - 删除之前对
Target -> Build Settings ->User Header Search Paths
设置,没设置的不用理会;
五.代码库的更新
当我们的代码需要更新时,例如MJRefreshPodsTest修改了部分代码,更新版本号为0.0.2;
1.修改.podspec 文件如下
Pod::Spec.new do |s|
s.name = "MJRefreshPodsTest"
s.version = "0.0.2"
s.summary = "根据MJRefresh作为源码的pods私有库测试,V0.0.2"
s.description = <<-DESC
根据MJRefresh作为源码的pods私有库测试,V0.0.2
DESC
s.homepage = "http://git.oschina.net/ruishengDu/MJRefreshPodsTest" #代码仓库主页
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = "肉身佛陀94"
s.platform = :ios, "8.0" #平台及最低支持版本
s.source = { :git => "https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git", :tag => "#{s.version}" }
s.source_files = "MJRefresh", "MJRefresh/**/*.{h,m}"
s.resource = 'MJRefresh/MJRefresh.bundle'
s.requires_arc = true #是否支持ARC
end
配置完成后,我们需要验证下 .podspec 文件的格式正确性,在终端输入
$ cd /Users/thinkjoy/Desktop/MJRefreshPodsTest
$ pod lib lint
成功后会有MJRefreshPodsTest passed validation.
的提示;
2.将本地修改后的MJRefreshPodsTest目录下的文件推到远程代码库
执行命令:
$ cd /Users/thinkjoy/Desktop/MJRefreshPodsTest
$ git add .
$ git commit -m '0.0.2完成'
$ git push https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git
$ git tag -a 0.0.2 -m 'V0.0.2'
$ git push --tags
完成后,远程版本库如下图:
远程代码库
3.将代码中的pod描述文件推送到版本仓库
执行命令:
$ pod repo push MyRepos MJRefreshPodsTest.podspec
成功后通过~/.cocoapods/repos/MyRepos查看,新增的版本库中已添加MJRefreshPodsTest的描述信息,如图:
~/.cocoapods/repos/MyRepos目录
MyRepos
远程版本仓库中同样已添加MJRefreshPodsTest的描述信息,如图:
此时,我们可以在pod 中搜索MJRefreshPodsTest,点击键盘的Q键
退出pod search
命令
$ pod search MJRefreshPodsTest
-> MJRefreshPodsTest (0.0.2)
根据MJRefresh作为源码的pods私有库测试,V0.0.2
pod 'MJRefreshPodsTest', '~> 0.0.2'
- Homepage: http://git.oschina.net/ruishengDu/MJRefreshPodsTest
- Source: https://git.oschina.net/ruishengDu/MJRefreshPodsTest.git
- Versions: 0.0.2, 0.0.1 [MyRepos repo]
(END)
代码库更新成功;
本文档仅用来记录学习的过程,如有错误的地方还望指正,
网友评论