Cocoapods Private Pods

Cocoapods Private Pods

前言

2018年底遗留篇补充系列1

2018年底遗留篇补充系列2

spec repo ?

spec repo 是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,他实际是一个Git仓库remote

当你使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下

创建 spec repo

可在私有Git服务器上, 创建 spec 仓库 (和正常的创建仓库没有任何区别)

添加 spec repo

pod repo add YQSpecs http://m24.ink:3000/yuqiang/YQSpecs.git

注: 格式为 pod repo add 仓库名 仓库地址

创建私有仓库/组件/工具代码/项目工程代码

pod lib create MyLibrary

注: 格式为 pod lib create 库/组件名称

执行命令后需要回答几个问题进行简单的配置

  1. 想使用的平台? [iOS / macOS ]

     What platform do you want to use?? [ iOS / macOS ]
    
  2. 想使用的开发语言? [ Swift / Objc]

     What language do you want to use?? [ Swift / ObjC ]
    
  3. 是否需要包含一个示例工程? [ Yes / No ] 建议选 YES

     Would you like to include a demo application with your library? [ Yes / No ]
    
  4. 选择一个测试框架. [ Specta / Kiwi / None ]

     Which testing frameworks will you use? [ Specta / Kiwi / None ]
    
  5. 是否基于View测试? [ Yes / No ]

     Would you like to do view based testing? [ Yes / No ]
    
  6. 类的前缀

     What is your class prefix?
    

我这里选择的是:

1. iOS
2. Objc
3. Yes
4. None
5. No
6. YQ

配置结束后, 会自动打开工程

仓库结构预览

$ tree LibDemo -L 2
LibDemo
├── Example                     # Demo工程
│   ├── LibDemo
│   ├── LibDemo.xcodeproj
│   ├── LibDemo.xcworkspace
│   ├── Podfile
│   ├── Podfile.lock
│   ├── Pods
│   └── Tests
├── LICENSE
├── LibDemo                     # 源文件
│   ├── Assets                  # 源文件之资源(xml, png, db, plist...)
│   └── Classes                 # 源文件之代码(.h, .m, .Swift...)
├── LibDemo.podspec
├── README.md
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
  • LibDemo -> Example 目录为 Demo工程
  • LibDemo -> LibDemo 目录为源代码及资源文件
  • LibDemo -> LibDemo.podspec 文件为库的配置信息文件, 需要上传至 spec repo

PodSpec

Pod::Spec.new do |s|
  s.name             = 'LibDemo'
  s.version          = '0.1.0'
  s.summary          = 'A short description of LibDemo.'
  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'yuqiang' => 'yuqiang@yuqiang.com' }
  s.source           = { :git => 'https://m24.ink:3000/yuqiang/LibDemo.git', :tag => s.version.to_s }

  s.ios.deployment_target = '8.0'
  s.source_files = 'LibDemo/Classes/**/*'
end
  • s.name 仓库名称
  • s.version 仓库版本 对应 Git管理的 tag 值
  • s.summary 仓库简介
  • s.description 仓库描述
  • s.license 开源协议
  • s.author 作者
  • s.source 源代码仓库
  • s.ios.deployment_target 最低支持的系统版本
  • s.source_files 源代码仓库下的具体源码文件路径

更过信息请查看官方文档 Podspec Syntax Reference

Bundle

iOS 中, 主工程中获取的图片, file文件等都是默认使用的 [NSBundle mainBundle],

在仓库里需要获取指定Framework对应的 Bundle

#import "NSBundle+LibDemo.h"
#import "xxxxx.h"

@implementation NSBundle (LibDemo)

+ (NSBundle *)libDemo_bundle {
    return [NSBundle bundleForClass:[xxxxx class]];
}

@end

注: #import "xxxxx.h", 为当前库的任意一个Class, 目的是为了根据该类获取当前库的Bundle

获取 bundle 时 使用 [NSBundle LibDemo_bundle] 即可

资源图片

xxx.podspec 文件中配置资源文件的Bundle

s.resource_bundles = {
     'xxx_Images' => ['LibDemo/Assets/Assets.xcassets']
   }

增加UIImage扩展

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

@implementation UIImage (LibDemo)

+ (UIImage *)libDemo_imageNamed:(NSString *)name {
    NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle libDemo_bundle] URLForResource:@"xxx_Images" withExtension:@"bundle"]];
    return [self libDemo_imageNamed:name inBundle:bundle];
}


+ (UIImage *)libDemo_imageNamed:(NSString *)name inBundle:(NSBundle *)bundle {
    return [self imageNamed:name inBundle:bundle compatibleWithTraitCollection:nil];
}

@end

加载图片时使用[UIimage libDemo_imageNamed:@"xxx"] 方法即可

Swift 实现上述扩展功能

以下为 Swift 实现的上述功能扩展

针对具体的podspec配置, 需要做部分修改(切勿copy使用)

extension Bundle {
    class func sgftf_bundle() -> Bundle {
        return Bundle(for: SGFloatingLabelTextField.self)
    }
    
    class func sgftf_imagsBundle() -> Bundle {
        let urlOption = Bundle.sgftf_bundle().url(forResource: "SGFTF_Images", withExtension: "bundle")
        if let url = urlOption {
            if let bundle = Bundle(url: url) {
                return bundle
            }
        }
        return Bundle.main
    }
}

extension UIImage {
    class func sgftf_imageNamed(_ name: String, in bundle: Bundle = Bundle.sgftf_imagsBundle()) -> UIImage? {
        let image = UIImage(named: name, in: bundle, compatibleWith: nil)
        return image
    }
}

依赖

libraries

s.libraries = 'c++', 'z', 'sqlite3'

frameworks

s.frameworks = 'UIKit', 'MapKit', 'CoreLocation', 'CoreTelephony', 'SystemConfiguration'

vendored_frameworks 首先把第三方framework拷贝至指定文件夹,使用如下方式增加依赖

s.vendored_frameworks = 'xxx/Assets/Frameworks/*.framework'

其它pod库

s.dependency 'Masonry'
s.dependency 'MJExtension'

配置

禁用bitcode

s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO' }

Tag

开发完成, 需要增加 tag

注意: tag 值 需要和 podSpec 文件中的 s.version 对应

// 查看 tag 列表
git tag

// 新增 tag
git tag 0.0.1

// 推送 tag 到远端
git push --tags

删除tag

删除本地 tag
git tag -d 0.0.1

删除远程 tag
git push origin :refs/tags/0.0.1

pod lib lint

验证 lib

pod lib lint YQSpecs --sources=http://m24.ink:3000/yuqiang/YQSpecs.git,master LibDemo.podspec --allow-warnings
  • YQSpecs 为文章开头时的 spec repo
  • --sources=xxx.git,masterYQSpecs 的仓库地址
  • LibDemo.podspec 为制作的仓库的配置文件
  • --allow-warnings 忽略警告

pod repo push

添加 Podspec 到 spec repo

pod repo push YQSpecs --sources=http://m24.ink:3000/yuqiang/YQSpecs,master LibDemo.podspec --allow-warnings --verbose
  • YQSpecs 为文章开头时的 spec repo
  • --sources=xxx.git,masterYQSpecs 的仓库地址
  • LibDemo.podspec 为制作的仓库的配置文件(当该文件在当前目录下时,可省略)
  • --allow-warnings 忽略警告
  • --verbose 显示详细信息
  • --swift-version=5 指定使用的swift版本

执行过程如下:

  1. Validating spec (验证lib 版本, 系统版本)

  2. Analyzing dependencies (分析依赖库)

  3. Downloading dependencies (下载安装依赖库)

  4. Testing with xcodebuild (命令行编译)

  5. Updating the YQSpecs repo (更新远程仓库)

  6. Adding the spec to the YQSpecs repo (添加 spec)

  7. Pushing the YQSpecs repo (推送 spec)

使用 制作的 pod

在项目的Podfile 文件中增加 Source

# cocoapods 的 repo url
source 'https://github.com/CocoaPods/Specs.git'

# private pod 的 repo url
source 'http://m24.ink:3000/yuqiang/YQSpecs.git'

target 'LibDemo_Example' do
  pod 'LibDemo'
end

Tip

  1. 根据 podspec 生成 CHECKSUMS

     pod ipc spec xxx.podspec | openssl sha1
        
     // 例输出结果:4636a257060f6f1b4e143a143028b61a2b462d0d
    

参考文章

Private Pods

使用Cocoapods创建私有podspec

给 Pod 添加资源文件

Loading Disqus comments...
Table of Contents