目前iOS组件化常用的解决方案是Pod+路由+持续集成,通常架构设计完成后第一步就是将原来工程里的模块按照架构图分解为一个个独立的pod工程(组件),今天我们就来看看如何创建一个Pod私有库。

新建:pod lib create

假设我们需要创建的库名为TestLib,下面我们使用Pod官方提供的创建模板:

首先进入我们的工作目录,如workspace,输入命令

pod lib create TestLib

创建过程中需要填写几个问题,如下图所示,按个人所需填写:

创建完成以后工程会自动打开,Xcode目录和实际路径有一定区别,截图如下:

解决这个问题也很简单,将文件夹作为Group拖动到Xcode中即可:(如果Xcode工程中本身已经包含Classes目录,可以忽略这一步)

然后删除ReplaceMe.swift文件,在Class目录创建一个名为TestClass的swift文件:

在TestClass中定义ClassA和ClassB,注意其中一个是public的

import Foundation

public class ClassA {   //这是public类,可被外部工程访问
public let name = "ClassA"
let age = 18
} class ClassB { //不是public类,不能被外部工程访问
let name = "ClassB"
}

重要:为了让改动生效,一定要重启Xcode一次,然后在Example工程下执行(有时Xcode不会更新Pod代码,需要重启)

pod install

就可以在代码中调用新写的类,注意到只能调用public修饰的属性

到这里使用Pod新建一个私有库就完成了。

验证: pod lib lint (podspec配置文件说明)

新建完成后,我们还需要验证,需要修改配置文件,通过下面的截图路径找到新建的私有库的配置文件:

或者在Xcode里的:

文件内容:

#
# Be sure to run `pod lib lint TestLib.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 https://guides.cocoapods.org/syntax/podspec.html
# Pod::Spec.new do |s| # 名称、版本号、概述
s.name = 'TestLib'
s.version = '0.1.0'
s.summary = 'A short description of TestLib.' # 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 # 主页、截图、license证书、作者信息、源代码地址、社交地址
s.homepage = 'https://github.com/xxx/TestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xxx' => 'xxx@xxx.com' }
s.source = { :git => 'https://github.com/xxx/TestLib.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' # iOS版本
s.ios.deployment_target = '8.0' # 源码所在路径
s.source_files = 'TestLib/Classes/**/*' # 资源文件所在地址
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# } # 对外公开的h文件地址,swift一般用不到
# s.public_header_files = 'Pod/Classes/**/*.h' # 包含的系统framework
# s.frameworks = 'UIKit', 'MapKit' # 包含的第三方pod
# s.dependency 'AFNetworking', '~> 2.3'
end

更详细的介绍可以访问官网https://guides.cocoapods.org/syntax/podspec.html

配置好以后我们需要做一次验证,在工程目录下使用命令

pod lib lint

初次验证可能遇到的几个问题:

  • Could not find a `ios` simulator (valid values: ). Ensure that Xcode -> Window -> Devices has at least one `ios` simulator listed or otherwise add one.

    这个问题是pod依赖的组件fourflusher与xcode版本不匹配造成的,可以使用如下命令更新
1.sudo gem uninstall fourflusher
2.sudo gem install fourflusher

必要的话还需要更新pod

sudo gem update cocoapods
  • [!] TestLib did not pass validation, due to 3 warnings (but you can use `--allow-warnings` to ignore them).

    pod验证发现3个及以上的warning就会报这个错,如果只是验证一下工程,能确保对外发布之前能修复,可以使用--allow-warnings

pod lib lint --allow-warnings

如果验证通过,会看到TestLib passed validation.,到这一步既完成验证

版本:iOS和Swift管理

通过pod官方模板做出来的工程iOS版本为8.0,Swift版本为4.0,我们有时需要根据需要修改版本号,需要在spec文件中添加:

  # iOS版本
s.ios.deployment_target = '9.0' # Swift版本
s.swift_versions = '5.0'

然后执行pod install更新工程即可

Git上传到私有库

现在私有Git服务器创建TestLib项目,然后回到工程目录,使用Git初始化命令:

git init
git remote add origin http://私有仓库地址/TestLib.git
git add .
git commit -m 'init'
git push -u origin master

然后修改spec文件内容

  # 主页、截图、license证书、作者信息、源代码地址、社交地址
s.homepage = 'http://私有库地址/TestLib.git'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'xxx' => 'xxx@xxx.com' }
s.source = { :git => 'http://私有库地址/TestLib.git', :tag => s.version.to_s }

如果需要对外发布版本时需打tag,然后创建同名branch

git tag -a 0.1.0 -m '0.1.0'
git branch 0.1.0

打包:pod package

有时我们不希望提供源代码,只提供framework给外部调用,可以使用package,首先安装pod插件:

sudo gem install cocoapods-packager

package参数:

参数名 注释
--force 覆盖之前的文件
--no-mangle 1.表示不使用name mangling技术,pod package默认是使用这个技术的。我们能在用pod package生成二进制库的时候会看到终端有输出Mangling symbols和Building mangled framework。表示使用了这个技术。2.如果你的pod库没有其他依赖的话,那么不使用这个命令也不会报错。但是如果有其他依赖,不使用--no-mangle这个命令的话,那么你在工程里使用生成的二进制库的时候就会报错:Undefined symbols for architecture x86_64。
--embedded 生成静态framework
--library 生成静态.a
--dynamic 生成动态framework
--bundle-identifier 动态framework需要的签名
--exclude-deps 不包含依赖的符号表,生成动态库的时候不能包含这个命令,动态库一定需要包含依赖的符号表
--configuration 表示生成的库是debug还是release,默认是release。--configuration=Debug
--subspecs 如果你的pod库有subspec,那么加上这个命名表示只给某个或几个subspec生成二进制库,--subspecs=subspec1,subspec2。生成的库的名字就是你podspec的名字,如果你想生成的库的名字跟subspec的名字一样,那么就需要修改podspec的名字。 这个脚本就是批量生成subspec的二进制库,每一个subspec的库名就是podspecName+subspecName。
--spec-sources=private,https://github.com/CocoaPods/Specs.git 一些依赖的source,如果你有依赖是来自于私有库的,那就需要加上那个私有库的source,默认是cocoapods的Specs仓库。--spec-sources=private,https://github.com/CocoaPods/Specs.git。

可以使用下面的命令打包:

pod package TestLib.podspec --force

使用CocoaPods创建自己的私有库-iOS组件化第一步的更多相关文章

  1. Mac终端的Cocoapods创建自己的私有库和公有库

    一,前言 为什么要用Cocopods 通常在开发的过程中,大多时候,我们会处理一类相同的操作,比如对于字符串String的邮箱验证,是否为空,手机号验证,或者一些UIView的动画操作,我们为了避免写 ...

  2. 通过构建Cocoapods私有库进行组件化开发探索

    专题一 一.创建私有索引库 选Github或者码云都可以,本例以Github为例.创建私有索引库用来作为自己组件库的索引: 二.本地添加私有索引库 添加:pod repo add 索引库名称 索引库地 ...

  3. iOS组件化开发入门 —— 提交自己的私有库

    前言:本人也是初次接触组件化开发,感觉现有的资料太繁杂,就简单整理了一下,在此跟大家分享一些入手的经验,主要就是描述cocoapods的私有库封装和提交.组件化开发是个大的议题,涉及到架构思路.设计模 ...

  4. iOS 组件化路由框架 WisdomRouterKit 的应用

    [前言] 大家好,写作是为了和读者沟通交流,欢迎各位开发者一起了解 WisdomRouterKit SDK 的功能. 关于 iOS 组件化路由方案框架: WisdomRouterKit 的功能介绍,之 ...

  5. iOS 组件化及二进制化的探索

    组件化的优缺点 组件化的拆分 组件与组件之间如何进行通讯(路由) 从Cocopods拉取代码的过程 远程索引库里很多的.spec文件,该文件记录了很多内容,如用户名,框架名称,描述,框架的地址 Pod ...

  6. iOS 组件化

    iOS 组件化介绍 随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间 ...

  7. iOS组件化实现方案

    作者原文iOS组件化 - 路由架构从0到1实战  合伙呀 1.CTMediator作为路由中间件 2.基础UI组件以pod形式引入,并且能够独立运行调试 3.基础工具组件以pod形式引入,并且能够独立 ...

  8. Cocoapods 创建自己的公开库、私有库

    如何创建自己的共有库 1.注册Trunk trunk需要CocoaPods 0.33版本以上,用pod --version 命令查看版本 CocoaPods版本 如果版本低,需要升级: sudo ge ...

  9. Cocoapods 应用第二部分-私有库相关

    我们在这里,使用的是 第一部分使用pod lib create YohunlUtilsPod 创建的framework工程来说明.其创建过程在此就不重复了,当然你也可以下载我已经创建好的demo ht ...

随机推荐

  1. java堆 (转)

     Java栈和堆 ----这两个概念未知很长一段时间,终于找到了一个很好的文本.使用和共享 1. 堆(stack)堆(heap)他们是Java使用Ram本地存储的数据. 与C++不同,Java主动管理 ...

  2. OpenGL(十二) 纹理映射(贴图)

    OpenGL绘制纹理的步骤: 1. 开启纹理功能 使用glEnable(GL_TEXTURE_2D)开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)关闭纹理,默认情况下纹理是关闭 ...

  3. js div的显示和隐藏

    <head>    <title></title>    <style type="text/css">        div    ...

  4. SQL Server分页存储过程笔记

    USE [database] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[ProcedureN ...

  5. redis zincrby zadd 遇到的问题

    在维护代理池时 报错1: zincrby(REDIS_KEY,proxy,-1)redis.exceptions.ResponseError: value is not a valid float 查 ...

  6. laravel 报错SQLSTATE[HY000] [2002] No such file or directory

    在mac中执行php artisan migrate时报错 SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from i ...

  7. linux系统中ls命令的用法

    普通文件: -,f目录文件: d链接文件(符号链接): L设备文件:字符设备:c块设备:b命名管道: p套接字文件: s linux文件时间戳 时间分为三种类型:创建时间,修改时间:open访问时间: ...

  8. C#调用Microsoft.DirectX.DirectSound.dll时出错

    1.修改工程的编译选项.我的开发运行环境是Windows 10 x64系统.需要修改一下工程的编译选项,把AnyCPU改成x86的. 未能加载文件或程序集“Microsoft.DirectX.Dire ...

  9. Twitter的分布式自增ID算法snowflake(雪花算法) - C#版

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...

  10. REDM基础教程1-下载、编译代码

    1.下载DM REDM的更新路径目前有两个,同步更新,可使用SVN或GIT下载对应代码 https://git.oschina.net/hgy413/REDM https://github.com/h ...