当前位置: 首页 > 编程日记 > 正文

发布开源框架到CocoaPods入坑指南

  • 个人原文博客地址: 发布开源框架到CocoaPods入坑指南
  • 在开发过程中一定会用到一些第三方框架, 只要安装了CocoaPods, 然后通过pod install命令, 就可以集成框架到项目中了
  • 可是如果想要把自己的框架或者组件也开源出去, 让别人也可以使用, 那该如何入手 ?
  • 对于CocoaPods还不是很了解的或者没有安装的童鞋, 可自行百度或者参考用CocoaPods做程序的依赖

搭建框架

创建仓库

  • CocoaPods项目的源码在Github上管理,所以第一步我们需要创建一个属于自己的仓库
  • 根据图下图所示创建自己的项目

上传文件

  • 要开发框架必然就要上传文件, 这里推荐SourceTreeGitHub客户端, 当然也可以使用终端命令上传
  • 使用git管理工具我们这里暂不赘述, 不懂得可以自行百度
  • 终端使用git命令上传, 主要命令如下
//cd到当前文件夹
// 创建本地仓库
git init
// 添加名称为origin的远程连接
git remote add origin '你的github项目地址'
// 将本地代码加入本地仓库里
git add .
// 提交修改到本地仓库
git commit -m '你的修改记录'
// 推送master分支的代码到名称为origin的远程仓库
git push origin master
复制代码

创建Podspec描述文件

  • 该文件为Cocoapods依赖库的描述文件,每个Cocoapods依赖库必须有且仅有那么一个描述文件
  • 简单地讲就是让CocoaPods搜索引擎知道你的代码的作者、版本号、源代码地址、依赖库等信息的文件
  • 文件名称要和我们想创建的依赖库名称保持一致
pod spec create 框架名字// 示例:
pod spec create TitanModel
复制代码
  • 该命令将在本目录产生一个名为TitanModel.podspec文件
  • 可用Sublime Text或者Atom打开该文件,里面已经有非常丰富的说明文档, 但是很多都是我们不需要的
  • 官方Podspec文件的编写格式可参考 Podspec Syntax Reference
  • 下面介绍如何声明第三方库的代码目录和资源目录,还有该第三方库所依赖ios核心框架和第三方库
  • 去掉文件中的一些注释信息, 可以看到也就剩下以下内容了
Pod::Spec.new do |s|s.name         = "TitanModel"s.version      = "0.0.1"s.summary      = "A short description of TitanModel."s.description  = "这是详细的描述, 但是字数要比summary的字数多, 不然上传的时候回有警告提示, 我这么说你能明白了吗?不明白的话我也没办法了"s.homepage     = "https://github.com/CoderTitan/TitanModel"s.license      = "MIT"s.swift_version = "4.0"s.author             = { "CoderTitan" => "quanjunt@163.com" }s.source       = { :git => "https://github.com/CoderTitan/TitanModel.git", :tag => "#{s.version}" }s.source_files  = "Classes", "Classes/**/*.{h,m,swift}"s.exclude_files = "Classes/Exclude"end
复制代码
  • s.name:名称,pod search搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错
  • s.version:版本号,to_s:返回一个字符串
  • s.summary: 项目简短的简介
  • s.description: 这个是详细的描述, 要注意的是字数要比summary的长, 否则上传的时候可能会爆出警告
  • s.homepage: 项目主页地址
  • s.license: 许可证
  • s.author: 作者
  • s.source: 项目源码所在地址
  • s.platform: 项目支持平台
  • s.requires_arc: 是否支持ARC
  • s.source_files: 需要包含的源文件
  • s.public_header_files: 需要包含的头文件
  • s.ios.deployment_target: 支持的pod最低版本
  • s.social_media_url: 社交网址
  • s.resources: 资源文件
  • s.dependency: 依赖库,不能依赖未发布的库

source_files写法及含义

"TitanModel"
"Classes/**/*.{h,m}"
复制代码
  • *表示匹配所有文件
  • *.{h,m}表示匹配所有以.h.m结尾的文件
  • **表示匹配所有子目录

将自己的项目打成tag

  • 因为cocoapods是依赖tag版本的,所以必须打tag,以后再次更新只需要把你的项目打一个tag,然后修改.podspec文件中的版本接着提交到cocoapods官方就可以了
  • 要注意的是, 这里提交的版本号要和TitanModel.podspec文件中的版本号一致
git tag "v0.0.1"  
git push --tags
复制代码

上传Podspec

  • Podspec修改完成后, 上传到服务器时, 我们需要使用trunk进行上传
  • 首先要注册trunk, 在注册trunk之前,我们需要确认当前的CocoaPods版本是否足够新。trunk需要pod0.33及以上版本,如果你不满足要求, 需要重新安装pod
  • 更新结束后,我们开始注册trunk, 可参考官方文档Getting setup with Trunk
  • 终端输入以下命令
pod trunk register 邮箱地址 '用户名' --description='描述'// 示例
pod trunk register quanjunt@163.com 'CoderTitan' --description='macbook'
复制代码

执行该命令后, 你的邮箱会受到一封邮件, 但是邮件要到垃圾邮件中才能找到, 打开邮件找到邮件中的网址并打开

如果打开邮件中的链接和下面的页面一样, 则表示注册成功

最后输入如下命令

pod trunk push TitanModel.podspec
复制代码

时间较长,耐性等待,大概5-10分钟, 成功后结果如下

  • 上面图片中可以看到执行了Updating spec repo master命令, 该命令主要就是更新本地的Specs文件
  • 查看文件夹位置, 打开访达文件夹, Shift+command+G快捷键, 打开前往文件夹操作, 输入如下目录即可查看
~/.cocoapods/repos/master/Specs
复制代码

测试自己的cocoapods

  • 终端输入pod search TitanModel查看
  • 但是如果输入上述命令后, 终端输出如下错误
[!] Unable to find a pod with name, author, summary, or description matching `TitanModel`
复制代码

这是因为你的框架已经上传, 但是你的本地的搜索文件search_index.json没有更新, 所以搜索不到, 可以执行下面命令删除search_index.json文件

rm ~/Library/Caches/CocoaPods/search_index.json
复制代码
  • 也可以直接找到该文件删除
  • 查看文件夹位置, 打开访达文件夹, Shift+command+G快捷键, 打开前往文件夹操作, 输入如下目录即可查看
~/Library/Caches/CocoaPods/
复制代码

搜索成功

总结

最后对上述涉及到的终端命令做一个简单的总结

终端命令

  1. 开源库发布之后,需要给项目打上tag
git tag "v0.0.1"  
git push --tags
复制代码
  1. 进入到项目根目录下,创建podspec文件
pod spec create TitanModel
复制代码
  1. 编辑podspec文件中的相关信息,有两个比较重要的地方s.sources.source_files, 修改完成后, 验证是否有误
pod spec lint TitanModel.podspec
复制代码
  1. 注册pod trunk
pod trunk register orta@cocoapods.org 'Orta Therox' --description='macbook air'
复制代码
  1. 发布到trunk
pod trunk push TitanModel.podspec
复制代码
  1. 搜索发布的框架
pod search TitanModel
复制代码

相关文章:

linux下打印机共享及监控

操作系统:centos6.0 主要软件:cups,samba,ghostpostscript 打印机:richo 3025 主要功能:通过samba将打印机共享给局域网用户,并实现对打印内容的监控 主要有三大步:本机安装打印机,通…

【H.264】x264命令详解:x264 --fullhelp

1、简述 宏区块: macroblock:。是一种图像压缩的术语。 宏区块是运动预测的基本单位,一张完整的图像(frame)通常会被切割成几个宏区块。h.264 的宏区块大小是可变的,常用 16x16 pixels。 帧类型 “帧”基础知识: 影片可以看作是由一张张连续的图片组成的,每幅图片就…

东大漆桂林、清华李涓子、复旦肖仰华等大牛确认出席CTA峰会!5月一起打卡杭州...

5月26日-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心召开。首届CTA核心技术及应用峰会将聚焦人工智能,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。20…

【Oracle Database】数据库用户管理

创建用户 SQL> create user soe identified by soe default tablespace soe temporary tablespace temp; User created.查询用户的默认表空间 SQL> set line 200 SQL> col username for a30 SQL> col account_status for a20 SQL> select username,account_stat…

MySQL两主多从,且故障转移配置

一、角色划分1、MySQL数据库规划主机名 IP地址 角色 mysql_server_idweiliaodb1 192.168.1.233 master1 1weiliaodb2 192.168.1.234 master2 2weiliaodb3 192.168.1.235 slave1 3monitor 192.168.1.240 mmm_mon -2、虚拟IP规划IP地址 角色192.168.1.10 writer192.168.1.20 read…

Go开发者路线图2019,请收下这份指南

整理 | Rachel责编 | 阿司匹林出品 | AI科技大本营(ID: rgznai100)Go是Google开发的一种静态、强类型、编译型、并发型,并具有垃圾回收功能的类C编程语言。2009以开源项目的形式发布,2012年发布1.0稳定版本,距今已经十…

【Ubuntu】在Ubuntu中设置永久的DNS

1、问题描述 ping不通域名,比如“ping www.baidu.com”时,报错“ping: unknown host www.baidu.com”。这是因为ubuntu默认情况下没有设置DNS。 在ubuntu上设置DNS的方法,修改“/etc/resolv.conf”,添加“nameserver 8.8.8.8”&a…

实习期间问题总结

主要针对实习期间,接触的部分问题进行总结,后续会不间断的补充,作为实习期间的回顾。 1,git ,github和gitlab的关系 git 是一个版本控制工具,github是一个用git做版本控制的项目托管平台,他是一个网站&…

在windows sever 2008系统中如何添加桌面体验功能

1.开启THEMES服务:运行-services.msc -找到Themes服务项,默认是禁用,改为自动。 2.运行服务器管理器:左窗口选择功能-右边点“添加功能”在弹出的“添加功能向导”窗口中拖到最下面,…

17篇论文入选CVPR 2019,百度AI都在关注什么?(附论文地址)

整理 | 阿司匹林出品 | AI科技大本营(公众号id:rgznai100)计算机视觉和模式识别大会CVPR 2019即将于6月在美国长滩召开,作为人工智能领域计算机视觉方向的重要学术会议,CVPR每年都会吸引全球最顶尖的学术机构和公司的研…

【GStreamer】在x264enc中设置profile级别

1、问题描述 在使用GStreamer生成h.264的rtmp流时,不知道怎么设置h.264的profile级别。默认一直是“high”: video/x-h264, ... profile=(string)high, ...2、解决方法 查看官网手册中,有如下解释 The H264 profile that is eventually used depends on a few settings. …

js 使用a标签 下载资源

文档 let data new Blob([hello ajanuw], {type: application/text})let src window.URL.createObjectURL(data)let dl document.createElement(a)dl.href src;dl.download hello.txtdl.click() 切片下载 let data new Blob([hello ajanuw], {type: application/text }) …

linux 新增swap分区

由于用vmware 物理机转换成虚拟机时 忘记把swap 分区转过来了,只能手动在系统里添加了 1建立1G 大小的交换分区 # dd if/dev/zore of/opt/swapfile bs1M count1024 2,设置交换分区文件 # mkswap /opt/swapfile 3.立即启用交换分区文件 # swapon /opt/swapfile 4.使系…

通过cookies跳过验证码登陆页面,直接访问网站的其它URL

我每次手动访问去NN网的一家酒店,就不需要登陆,一旦我用脚本打开就会让我登陆,而登陆页面又有验证码,不想识别验证码,所以就想:“通过cookies跳过验证码登陆页面,直接访问网站的其它URL”转载虫…

可视化深入理解损失函数与梯度下降 | 技术头条

作者 | Hugegene译者 | 刘畅责编 | Rachel出品 | AI科技大本营(id:rgznai100)【导语】本文对梯度函数和损失函数间的关系进行了介绍,并通过可视化方式进行了详细展示。另外,作者对三种常见的损失函数和两种常用的激活函…

【Qt】Linux上设置自启动后qApp->applicationDirPath()的返回值问题

1、问题描述 开发程序过程中,使用qApp->applicationDirPath()返回程序所在目录,一直没问题。但是在设置自启动后,qApp->applicationDirPath()返回的目录不是程序所在目录。 2、原因分析 查看qApp->applicationDirPath()官方手册&…

sqlserver 行转列

还写了一篇Linq 实现 DataTable 行转列有时间大家可以看一下 sqlserver把行转成列在我们编码中是经常遇到的我做一个小例子大家看一下 1 --创建一个表 2 create table PayPhoneMoney 3 ( 4 id int identity(1,1), 5 userName Nvarchar(20), 6 payType nvarchar(20)…

Javascript闭包和闭包的几种写法及用途

好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了。好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法、用法和用途。 一、什么是闭包和闭…

【GStreamer】使用capsfilter设置x264enc中的profile级别

1、问题描述 在【GStreamer】在x264enc中设置profile级别中,通过设置x264enc的属性,只将profile由high级别切换到main,但是在切换到baseline时,失败了。 2、解决方法 这里使用capsfilter,直接指定x264enc的profile。相关代码如下: // 创建元素 GstElement *h264enc =…

一文帮你梳理清楚:奇异值分解和矩阵分解 | 技术头条

作者 | K. Delphino译者 | Linstancy编辑 | Rachel出品 | AI科技大本营(id:rgznai100)【导读】在推荐系统的相关研究中,我们常常用到两个相关概念:矩阵分解和奇异值分解。这两个概念是同一种算法吗?两者到底…

[转]程序员技术练级攻略

2019独角兽企业重金招聘Python工程师标准>>> 月光博客6月12日发表了《写给新手程序员的一封信》,翻译自《An open letter to those who want to start programming》,我的朋友(他在本站的id是Mailper)告诉我&#xff0…

聊天机器人落地及进阶实战 | 公开课速记

嘉宾 | 邵浩编辑 | suiling来源 | AI科技大本营在线公开课近年来,聊天机器人技术及产品得到了快速的发展。聊天机器人作为人工智能技术的杀手级应用,发展得如火如荼,各种智能硬件层出不穷。本次公开课中,AI科技大本营联合电子工业…

【GStreamer】官网基本教程学习(basic-tutorial)

目录 下载和编译basic-tutorial-1.c 直接创建管道播放视频basic-tutorial-2.c 创建元件-->装入管道-->连接元件0、gstreamer 函数调用顺序1、元素 videotestsrc 的 pattern 属性详解2、GST_BIN 将其它类型指针转换成 GstBin*basic-tutorial-3.c 信号触发后再连接元件0、g…

IdentityServer4关于多客户端和API的最佳实践【含多类型客户端和API资源,以及客户端分组实践】【中】...

上一篇文章中,我们已经完成了服务端数据库的搭建,本篇主要处理多【传统HTTP】【依赖CORE环境】客户端之间协同在线【SSO】以及不需要SSO的场景处理。 目标: 1)实现多类型客户端接入IdentityServer 后文简称【IDSV】 2)…

WEB SSH Ajaxterm客户端配置(1)

Ajaxterm是一款基于Web的SSH客户端软件,它是采用Python编写的,这也就保证了它能在多种Linux发行版的系统中使用,同时它的安装非常简单。实验环境:Centos 5.5 ip:192.168.20.165pcre-7.8.tar.gzAjaxterm-0.10.tar.gzn…

如何为回归问题选择最合适的机器学习方法?

作者 | 何从庆本文经授权转载自 AI算法之心(id:AIHeartForYou)在目前的机器学习领域中,最常见的三种任务就是:回归分析、分类分析、聚类分析。在之前的文章中,我曾写过一篇《15分钟带你入门sklearn与机器学…

【Qt】获取本地IP(IPv4)

1、问题描述 获取本地IP列表有“127.0.0.1”、IPv4、IPv6等,一般使用IPv4,如何从已经获取的IP列表中挑出IPv4。 2、解决方法 QString ipv4; auto ips = QNetworkInterface::allAddresses(); foreach (auto ip, ipps) {if ( (ip.

2.2元组介绍+字符串操作

元组可以理解为“一旦创建就不能再修改的列表”,所以也叫只读列表 语法:names("A","B","C","D") 他只有两个方法: ①count ②index 字符串操作: 示例:name"chan" 1…

医生再添新助手!深度学习诊断传染病 | 完整代码+实操

作者 | Dipanjan (DJ) Sarkar译者 | Monanfei编辑 | Rachel、Jane出品 | AI科技大本营(id:rgznai100)【导读】文本基于深度学习和迁移学习方法,对疟疾等传染病检测问题进行了研究。作者对疟疾的检测原理以及迁移学习理论进行了介绍…

DIV限制宽度,字符断行,避免变形

代码如下&#xff1a;<div style"width:740px;word-break:break-all;word-wrap:break-word;">参考文章怎么强制限制div宽度转载于:https://www.cnblogs.com/leftfist/archive/2012/02/07/4258078.html