Cocoapods私有仓库搭建

来自我的team
公共库创建:
http://blog.csdn.net/yangyangzhang1990/article/details/52851328

简介


目的

1、在开发过程中,会积累很多可以复用的代码,有些我们不想开源,又想像开源库一样在CocoaPods中管理它们,那么就可以通过私有仓库来管理
2、为后期的组件化方式实现做准备。
优点:
减少项目合并过程中的冲突,让项目结构更加整洁,方便项目组件迁移使用。
缺点:
进行私有库管理会比在项目开发中直接修复错误操作麻烦一些。

最坑的误区

需要注意pods私有库我们需要维护两个库:

一个是私有的Specs
一个是我们的代码工程

不要把这两个混在一起了。
参考地址: http://blog.csdn.net/yangyangzhang1990/article/details/52863220

如何制作出自己的私有库(其实很简单)

  • 建立私有的spec仓库 (例如:WLProjectPodsRepos)
    https://coding.net/ 创建私有仓库管理中心,主要用来管理我们所有私有库的.podspec文件,项目名称为:WLProjectPodsRepos
  • clone私有的spec仓库到本地
    Clone 出错怎么办?
    Coding的使用帮助中心: https://coding.net/help/faq/git/git.html
    1、请确保 remote url (大小写敏感)是正确的
$ git remote -v
# 查看目前使用的 remote url
origin https://git.coding.net/username/repo-name.git (fetch)
origin https://git.coding.net/username/repo-name.git (push)
$ git remote set-url origin https://git.coding.net:username/right-name.git
# 修改为正确的 remote url

2、请确保自己在项目中的权限非 受限;
3、如果使用 https 方式 clone,服务器端一直返回 403 并且客户端不提示输入密码,则有可能是 git 客户端缓存了错误的密码,请清除已保存的密码

# 下面依次输入
$ git credential-osxkeychain erase
host=git.coding.net
protocol=https
[按回车]

克隆项目到本地

 $ cd WorkSpace/
 $ git clone https://git.coding.net/welian_xxx/WLProjectPodsRepos.git
# 输入有权限用户名密码
# xxxxxx  xxx

把公有Specs里面的CocoaPods-version.yml文件拷贝到WLPodsrepo,CocoaPods-version.yml所在位置见下图


屏幕快照 2016-12-10 下午12.44.55.png

并建立一个名为“Specs”的文件夹(文件夹里面可以放一个无关的小文件,否则推送远程时候,可能会被忽略)

把添加的内容推送到远端仓库,私有Specs创建完成
$ cd WLProjectPodsRepos/
$ git add .
$ git pull 
$ git commit -s -m "Add PodInfo"
$ git push origin master
将包装好的远程的私有Specs仓库再次 clone到 本地
$ pod repo add  [SpecRepoName]  [GitAddress] clone 到 .cocoapods 目录下
$ pod repo add WLProjectPodsRepos https://git.coding.net/welian_wu/WLProjectPodsRepos.git

执行成功,在本地~/.cocoapods/repos路径下就能发现,多了一个 WLProjectPodsRepos的文件夹


屏幕快照 2016-12-10 下午1.19.47.png

自己的私有库工程

创建远程仓库 本地工程,同步代码,参考Cocoapods公有库项目工程创建。详见:http://blog.csdn.net/yangyangzhang1990/article/details/52851328

1、创建项目工程,并把项目工程上传到git上面, 核心代码添加到 Classes 文件中
屏幕快照 2016-12-10 下午4.48.30.png
2、把本地项目与Git仓库进行关联
$ cd /Users/liuwu/WorkSpace/WLCommonKit
$ git init
# 把整个目录添加add 通配符
$ git status
$ git add . # 将本地文件添加到仓库
$ git commit -m "commit all files"
# 将本地与Coding仓库关联起来
$ git remote add origin https://git.coding.net/welian_wu/WLCommonKit.git
$ git pull origin master
$ git push origin master

git pull的时候出现错误:

error:
fatal: refusing to merge unrelated histories
解决方案
$ git pull origin master --allow-unrelated-histories
之后,会进入vim编辑状态,如果合并信息没有强求,直接输入q:直接退出
3、把项目类文件放入Classes文件夹中

为项目工程打tag
pods管理下的库,版本是根据git的tag来区分的,所以我们创建好工程之后需要为我们的仓库打一个tag,并且推送到远程仓库

$ git tag 0.0.1 # 未本地仓库打tag
$ git push --tags # 推送到远程仓库
工程中添加podspec (一定要 cd 到当前工程路径,在添加 podspec)
  • 1、创建spec文件,文件内容
    pod spec create WLCommonKit
    

会在当前目录下生成 .podspec 文件

  • 2 、编辑.podspec文件,相应配置代表的意思 百度 谷歌 或者自己翻译下吧

Be sure to run `pod spec lint WLCommonKit.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 = "WLCommonKit"
s.version = "0.0.1"
s.summary = "A short description of WLCommonKit."

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/WLCommonKit"

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'.

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 = { "" => "" }

Or just: s.author = ""

s.authors = { "" => "" }

s.social_media_url = "http://twitter.com/"

――― 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/WLCommonKit.git", :tag => "#{s.version}" }

――― 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}"
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"

s.library = "iconv"

s.libraries = "iconv", "xml2"

――― 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

s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }

s.dependency "JSONKit", "~> 1.4"

end
```
注意:
1 s.version应和tag的版本一致;
2 将源代码放置在固定的文件夹下,同时修改s.source;
3 验证podspec文件;

$ pod lib lint
$ pod lib lint WLCommonKit.podspec --allow-warnings --use-libraries

4 推送podspec文件 到pods的specs首先push修改后的podspec文件到本地工程的git远程仓库

$ git commit -a -m "Add WLCommonKit.podspec文件"
$ git push origin master
  • 3、提交 spec文件(私有库 提交到自己的specs 文件夹中,公有库使用 trunk 提交到Cocoapods的官方specs 中)

$ cd /Users/liuwu/WorkSpace/WLCommonKit

把当前的.podspec文件推送到WLPodsrepo私有库当中

$ pod repo push WLProjectPodsRepos WLCommonKit.podspec
or

如有警告使用下面

$ pod repo push WLProjectPodsRepos WLCommonKit.podspec --allow-warnings
--use-libraries

不出意外 用pod搜索就能搜到
  ```
$ pod search WLCommonKit
  • 4、如何使用私有库
    我们这里创建一个 test555的工程,按照截图中的方法进行编辑 Podfile文件,就可以正常使用了

    platform :ios, '8.0'
    

公有库

source 'https://github.com/CocoaPods/Specs.git'

私有库

source 'https://git.coding.net/welian_wu/WLProjectPodsRepos.git'
use_frameworks!
def shared_pods
pod 'WLCommonKit'
pod 'Masonry'
...
end
target 'WLCommonKit' do
shared_pods
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '3.0'
end
end
end
```
执行 pod install 安装成功

其他人怎么使用远程私有库
  • 将远程的私有Specs仓库Clone到本地
    $ pod repo add  [SpecRepoName]  [GitAddress]
    # clone 到 .cocoaPods 目录下 添加私有仓库到本地
    $ pod repo add WLProjectPodsRepos https://git.coding.net/welian_wu/WLProjectPodsRepos.git
    # 更新私有库资源
    $ pod repo update WLProjectPodsRepos
    

查询本地是否有对应的项目库

$ pod search WLCommonKit

最后是 编辑项目Podfile文件 pod install;

#####私有库依赖私有库
参考上面,创建私有仓库,添加.podspec文件。修改spec文件 比如:
![屏幕快照 2016-12-14 下午10.57.58.png](http://upload-images.jianshu.io/upload_images/1825863-5ffdd6a6de38b52c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

提交私有项目库内容到远程Git仓库。然后,使用以下方式验证.podspec文件。
![屏幕快照 2016-12-14 下午11.00.23.png](http://upload-images.jianshu.io/upload_images/1825863-e183c1711a1e68a7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#####出现错误处理
1、[!] Unable to find a pod with name, author, summary, or description matching WLKit

解决 : rm ~/Library/Caches/CocoaPods/search_index.json

2、Setting up CocoaPods master repo
亲 ,动一动 谷歌下
3
![屏幕快照 2016-12-14 下午11.04.22.png](http://upload-images.jianshu.io/upload_images/1825863-d60e5ad7cc60b217.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容