制作本地私有Pods库, 并将其发布到远端Pods

本文主要介绍如何制作私有的Pod库, 以及如何将其发布到远端Pods仓库. 一般公司自己开发的库, 如果涉及到公司的核心技术, 都不会发布到Pods仓库, 公司会将这个库制作成私有Pod库, 放在公司自己的服务器上自己使用, 这就涉及的私有库的制作. 如果公司希望将自己的一项技术对外推广, 一般会将其发布到Pods仓库中和开发者共享.下面将针对如何制作私有的Pod库, 以及如何将其发布到远端Pods仓库做详细阐述.阅读本文需要有一定的git和cocoaPods的使用经验.

制作私有Pods

1, 在github创建自己的仓库

2, 将项目克隆到本地 (git clone 仓库地址)

3, 将需要发布的文件拖入本地仓库

4, 将本地仓库推到远程仓库 add, commit, push

5, 创建tag, 并将tag同步到远程仓库 (参考附件git创建tag的方法)

6, 创建podspec文件 pod spec create PodName, 并根据要求编辑 .podspec 文件,大致格式如下(此案例是没有设置依赖库的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	Pod::Spec.new do |s|
	
	  s.name         = "source"
	
	  s.version      = "0.0.1"
	
	  s.summary      = "A linked up and down scroll component for iOs in swift."
	
	  s.homepage     = "https://github.com/heron-newland/podSwiftTest"
	
	  s.description  = <<-DESC
		A very good tool to your apps. this is a test version.
	                   DESC
	
	  s.license      = "MIT"
	
	  s.author             = { "Heron" => "objc_china@163.com" }
	
	  s.platform     = :ios, "10.0"
	
	
	  s.source       = { :git => "https://github.com/heron-newland/podSwiftTest.git", :tag => "0.0.1" }
	
	
	  s.source_files  = "source/*.swift"
	
	end

7. 编辑完成之后同步到远程仓库, 终端命令如下

1
2
3
pod add .
pod commit -m "本次提交的一些描述"
pod push

8. 校验podspec文件: pod spec lint PodName.podspec --verbose 注意PodName是你自己创建的那个podspec文件的名称

校验会遇到各种问题:

  • 警告:

    WARN | [iOS] swift_version: 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

解决方法: 终端运行 echo "4.0" > .swift-version 设置swfit版本

  • 错误

    ERROR [iOS] xcodebuild: Returned an unsuccessful exit code.

解决方法: 可能是哪个环节出问题了, 将git仓库删掉重新操作一遍, 一般能成功

ERROR [iOS] file patterns: The source_files pattern did not match any file.

有可能是源文件的目录没有配置正确, 如果你确定目录配置完全正确, 那么将git仓库删掉重新操作一遍, 一般能成功

9. 在本地使用pod导入私有库的方法:

通过指定源文件(.swift文件或者.h,.a文件)路径的方法安装,

  • pod ‘LinkedScroll’, :path => ‘/Users/bochb/Desktop/LinkedScroll/LinkedScroll’

LinkedScrollLinkedScroll.podspec所在的文件夹, 并且项 目源文件也要在这个文件夹中

通过指定.podspec所在路径的方式,(源文件在哪里都可以)

  • pod ‘LinkedScroll’, :path => ‘/Users/bochb/Desktop/LinkedScroll/LinkedScroll/LinkedScroll.podspec’

发布到Pods

1. 注册trunk: pod trunk register email 'name' --description='balabala', 然后在邮箱验证会收到一封验证邮件点击链接即可完成验证

2. pod trunk me 查看注册信息

3. pod trunk push 发布

删除已经发布到cocoaPods的库:

1
2
步骤一:	过期该库. pod trunk deprecate LinkedScroll
步骤二: 删除对应的版本.  pod trunk delete LinkedScroll 0.0.1

备注: 更多 pod trunk 命令可以通过 pod trunk help 查看

版本升级

修改或者添加文件, 然后将上述步骤重新执行一遍, 只是在打新tag后, 在.podspec文件中要做对应的修改

问题

  • 1.发布之后pod search搜索不到自己的库

解决办法:

1
2
3
 1.rm ~/Library/Caches/CocoaPods/Search_index.json
 2. pod setup
 3.pod seasrch
  • 发布之后在cocoapods.org官网无法找到自己的库

解决办法:

1
等一段时间才能查询到, 哈哈哈
  • 自己发布的框架, 通过pod导入后不能使用类或者函数

解决办法:

1
使用的类或者函数没有使用open或者pulic修饰

备注: 能够被模块以外的访问的必须使用open或者public, 下面简单说明一下权限的五个关键字

open: 能在任何类访问, 重写或者继承, 全开放.

public: 可以被任何类访问, 但是在其他的模块(module)中不能被重写和继承

模块内是指不需要使用import引用文件就能创建对象, 模块外需要使用import引入文件,才能创建对象

internal: 在整个模块中可以使用

fileprivate: 在整个swift文件(一个swift文件中可以包含多个类, 在这个swift中的所有类中都可以访问, 这是和private的区别)中可以被访问, 重写和继承

private: 只能被本类使用, 包括延展(extension)

附件

git –help: 查看git命令, git tag –help: 查看tag操作相关的命令

git创建tag的方法:

步骤一: git tag v1.0

步骤二: git push origin –tags

删除tag的方法

删除本地tag: git tag -d 0.0.1

删除远程仓库tag: git push origin -d tag 0.0.1

列显已有的标签

列出现有标签的命令非常简单,直接运行 git tag 即可:

1
2
3
$ git tag
v0.1
v1.3 显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。

我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:

1
2
3
4
5
$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签 创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

1
2
3
4
5
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

1
2
3
4
5
6
7
8
9
10
11
12
$ git show v1.4
tag v1.4
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 14:45:11 2009 -0800

my version 1.4

commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'

我们可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。

签署标签 如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ git tag -s v1.5 -m 'my signed 1.5 tag'

	You need a passphrase to unlock the secret key for
	user: "Scott Chacon <schacon@gee-mail.com>"
	1024-bit DSA key, ID F721C45A, created 2009-02-09
	现在再运行 git show 会看到对应的 GPG 签名也附在其内:

$ git show v1.5

	tag v1.5
	Tagger: Scott Chacon <schacon@gee-mail.com>
	Date:   Mon Feb 9 15:22:20 2009 -0800
	
	my signed 1.5 tag
	-----BEGIN PGP SIGNATURE-----
	Version: GnuPG v1.4.8 (Darwin)
	
	iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
	Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
	=WryJ
	-----END PGP SIGNATURE-----
	commit 15027957951b64cf874c3557a0f3547bd83b3ff6
	Merge: 4a447f7... a6b4c97...
	Author: Scott Chacon <schacon@gee-mail.com>
	Date:   Sun Feb 8 19:02:46 2009 -0800
	
	    Merge branch 'experiment'

稍后我们再学习如何验证已经签署的标签。

轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:

1
$ git tag v1.4-lw

查看tag

1
2
3
4
5
6
7
$ git tag

	v0.1
	v1.3
	v1.4
	v1.4-lw
	v1.5

现在运行 git show 查看此标签信息,就只有相应的提交对象摘要:

1
2
3
4
5
6
7
8
$ git show v1.4-lw

	commit 15027957951b64cf874c3557a0f3547bd83b3ff6
	Merge: 4a447f7... a6b4c97...
	Author: Scott Chacon <schacon@gee-mail.com>
	Date:   Sun Feb 8 19:02:46 2009 -0800
	
	    Merge branch 'experiment'

验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git tag -v v1.4.2.1
	object 883653babd8ee7ea23e6a5c392bb739348b1eb61
	type commit
	tag v1.4.2.1
	tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
	
	GIT 1.4.2.1
	
	Minor fixes since 1.4.2, including git-mv and git-http with alternates.
	gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
	gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
	gpg:                 aka "[jpeg image of size 1513]"
	Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

若是没有签署者的公钥,会报告类似下面这样的错误:

1
2
3
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

后期加注标签

你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:

$ git log –pretty=oneline

1
2
3
4
5
6
7
8
9
10
	15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
	a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
	0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
	6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
	0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
	4682c3261057305bdd616e23b64b0857d832627b added a todo file
	166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
	9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
	964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

$ git tag -a v1.2 9fceb02 可以看到我们已经补上了标签:

1
2
3
4
5
6
7
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2

1
2
3
4
5
6
7
8
9
10
	tag v1.2
	Tagger: Scott Chacon <schacon@gee-mail.com>
	Date:   Mon Feb 9 15:32:16 2009 -0800
	
	version 1.2
	commit 9fceb02d0ae598e95dc970b74767f19372d61af8
	Author: Magnus Chacon <mchacon@gee-mail.com>
	Date:   Sun Apr 27 20:43:35 2008 -0700
	
	    updated rakefile
分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ git push origin v1.5

	Counting objects: 50, done.
	Compressing objects: 100% (38/38), done.
	Writing objects: 100% (44/44), 4.56 KiB, done.
	Total 44 (delta 18), reused 8 (delta 1)
	To git@github.com:schacon/simplegit.git
	* [new tag]         v1.5 -> v1.5
	*  >如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项:

$ git push origin --tags

	Counting objects: 50, done.
	Compressing objects: 100% (38/38), done.
	Writing objects: 100% (44/44), 4.56 KiB, done.
	Total 44 (delta 18), reused 8 (delta 1)
	To git@github.com:schacon/simplegit.git
	 * [new tag]         v0.1 -> v0.1
	 * [new tag]         v1.2 -> v1.2
	 * [new tag]         v1.4 -> v1.4
	 * [new tag]         v1.4-lw -> v1.4-lw
	 * [new tag]         v1.5 -> v1.5

错误

1. pod spec lint PodName.podspec --verbose 命令总报如下错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	[!] Oh no, an error occurred.
	
	Search for existing GitHub issues similar to yours:
	https://github.com/CocoaPods/CocoaPods/search?q=Malformed+version+number+string+v1.0.0&type=Issues
	
	If none exists, create a ticket, with the template displayed above, on:
	https://github.com/CocoaPods/CocoaPods/issues/new
	
	Be sure to first read the contributing guide for details on how to properly submit a ticket:
	https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md
	
	Don't forget to anonymize any private data!
	
	Looking for related issues on cocoapods/cocoapods...
	Found no similar issues. To create a new issue, please visit:
	https://github.com/cocoapods/cocoapods/issues/new

解决办法: (源文链接)

1
2
	sudo rm -fr ~/.cocoapods/repos/master
	pod setup

备注: 如果上述办法不能解决, 请尝试如下方法 解决方法:

1
2
	$ sudo gem uninstall cocoapods   (卸载当前的CocoaPods
	$ sudo gem install cocoapods -v 0.38.1  (安装0.38.1版本的CocoaPods