cocoaPods私有组件库的创建与使用

一,创建私有pods

创建私有Spec Repo(也就是所有私有pod的仓库)

spec repopods的一个索引,是所有公开的podspodspec文件的一个仓库,其实就是一个部署在服务器的Git仓库,当你使用CocoaPods 后它会被Clone到本地的~/.cocoapods/repos这个仓库只存放podspec文件

步骤1:

1、在git上创建私有仓库地址
2、在终端terminal执行命令

# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add MySpecs https://git.net/winter/MySpecs.git
步骤2:

1、创建Pod项目工程

# pod lib create [Project Name] 
$ pod lib create MyLib

然后按照步骤一步一步执行,如果碰到创建失败的情况,更新cocoaPods再试试!

2、添加相关代码

├── MyLib
│   ├── Assets **存放资源文件!!!**
│   └── Classes
│       └── ReplaceMe.m **注意存放你自己实现的库相关代码!!!**
├── Example
│   **就是一个样例工程相关代码文件**

3、开发模式下测试pod
打开Example工程目录下的podfile文件:

#pod 'MyLib', :path => '../' # 指定路径
pod 'MyLib', :path => '../MyLib.podspec'  # 指定podspec文件

然后在Example工程目录下执行 pod update命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了
不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/MyLib中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。测试库文件没有问题,接着我们需要执行第4步

4、提交Pod到代码仓库,注意:不是podspec索引仓库,是代码仓库
在终端执行命令:

$ git add .
$ git commit -s -m "初始化MyLib 库"
$ git remote add origin git@git.net:winter/MyLib.git           #添加远端仓库
$ git push origin master     #提交到远端仓库
$ git tag -m "first release" "0.1.0" #打上标签,这个很重要
$ git push --tags     #推送tag到远端仓库

到这里,成功提交到远程代码仓库,MyLib Pod 库就初步完成了代码实现,接下来就是重点了,将制作的私有库放到podspec索引仓库。

步骤3:提交podspec文件到私有Spec Repo仓库

1、配置podspec文件

#
# Be sure to run `pod lib lint MyLib.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'MyLib'
  s.version          = '0.1.0'
  s.summary          = 'MyLib for example'

# 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
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'http://www.jianshu.com/u/06f42a993882'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'winter' => 'winter.wei@hey900.com' }
  s.source           = { :git => 'https://git.net/winter/MyLib.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.source_files = 'MyLib/Classes/**/*'
  
  s.resource_bundles = {
    'MyLib' => ['MyLib/Assets/*.png']
  }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
end

打开MyLib工程目录下的MyLib.podspec文件并参考上面的说明配置好相关选项。
podspec更多配置请参考:官方文档

2、编辑完MyLib.podspec文件后,需要验证一下这个MyLib.podspec文件是否可用

$ pod lib lint
// 如果终端输出这个信息,就说明验证通过,否则会提示错误信息,去修改
-> MyLib (0.1.0)
MyLib passed validation.

3、验证通过,想SpecRepo提交podspec

# pod repo push [Repo名] [podspec 文件名字]
$ pod repo push MySpecs MyLib.podspec

如果提交成功 终端上就会输出一些相关pod信息,如果不成功,则会打印一些失败信息,切记:失败后,去解决问题,或者更新cocoaPods。

二,使用cocoaPods

使用私有pods

我们可以直接指定某一个依赖的podspec,这样就可以使用公司的私有库。该方案有利于使企业内部的公共项目支持CocoaPods。

pod 'MySpec', :podspec => 'https://my.com/mySpec.podspec'

在创建私有pods遇到引用第三方framework(例如umeng)

需要注意,如果 pod repo push 出现下面的错误信息:

can't get podspec validation - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code

解决办法,可以试试:

1,pod lib lint --allow-warnings
2,解决所有的warning
3,pod repo push <repo-name> <podspec-file-name>.podspec --allow-warnings --use-libraries

如果pod lib lint --allow-warnings出现一些 not find file之类的warning,一定要解决掉,否则也会出现以上错误信息。

不更新pods

CocoaPods在执行pod install和pod update时,会默认先更新一次pod spec索引,使用--no-repo-update参数可以禁止其做索引更新操作。

pod install --no-repo-update
pod update --no-repo-update

给Pods添加资源文件

podspec里面

s.resource_bundles = {
     'MyLibrary' => ['your/path/Assets/**/*.{png,xib,plist}']
}
访问bundle

一般情况下,我们自己创建的pods添加的资源文件,使用[NSBundle mainBundle]是找不到该资源的路径,所以,在这里,我们需要创建一个NSBundlecategory

@implementation NSBundle (MyLibrary)

+ (NSBundle *)my_myLibraryBundle {
    return [self bundleWithURL:[self my_myLibraryBundleURL]];
}

+ (NSURL *)my_myLibraryBundleURL {
    NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
    return [bundle URLForResource:@"MyLibrary" withExtension:@"bundle"];
}
@end

顺便说下,MYSomeClass这个类可以是任意类名,但是有个前提,这个类必须是在你创建的library或者framework内。再说这个逻辑:先拿到最外面的bundle,对framework链接方式来说是framework的bundle的根目录,对静态库链接方式来说就是 target client 的main bundle,然后再去找下面名为MyLibrary的bundle。

图片资源的访问

上面我们已经可以正常访问我们自己的bundle,如果访问我们自己bundle的图片资源,还是一样创建UIImagecategory

#import "UIImage+MyLibrary.h"
#import "NSBundle+MyLibrary.h"

@implementation UIImage (MyLibrary)

+ (UIImage *)my_bundleImageNamed:(NSString *)name {
    return [self my_imageNamed:name inBundle:[NSBundle my_myLibraryBundle]];
}


+ (UIImage *)my_imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0
    return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
#elif __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_8_0
    return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
#else
    if ([UIImage respondsToSelector:@selector(imageNamed:inBundle:compatibleWithTraitCollection:)]) {
        return [UIImage imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
    } else {
        return [UIImage imageWithContentsOfFile:[bundle pathForResource:name ofType:@"png"]];
    }
#endif
}
@end

+ imageNamed:inBundle:compatibleWithTraitCollection:这个方法iOS8以后才有,所以需要条件编译。+ imageWithContentsOfFile:没有缓存机制。

Unable to find a specification for xxxxx问题

有时候在安装某一第三方会出现 “Unable to find a specification for xxxxx” 这个问题,在这里找到了解决方法,只需要把当前Pod的目录清理一下就行了。在终端执行以下命令:

pod repo remove master  
pod setup

setup(pod setup可能需要花费很长时间)成功后执行installupdate即可.

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

推荐阅读更多精彩内容