制作自己的CocoaPods公开库(涉及modulemap)

创建GIT仓库


图1
Repository name 仓库名称
Description 描述
Public / Private 公开仓库或者私人仓库
Initialize this repository with a README 创建一个README文件
Add .gitignore 需要忽略的文件类型
Add a license 添加一个许可证,如果项目需要上传到cocoapods,最好选择一个。

将仓库克隆到本地指定目录,该目录下将自动创建HCKit-Swift文件夹,并且包含LICENSE和README.md文件。

cd /Users/chenhc/Documents/Swift
git clone https://github.com/chyo/HCKit-Swift.git

创建一个项目,并将项目根目录中的文件移动到HCKit-Swift目录中


图2

创建Pods依赖文件


cd HCKit-Swift
pod spec create HCKit-Swift

HCKit-Swift根目录中将出现HCKit-Swift.podspec文件,将文件的内容修改为自己所需的


Pod::Spec.new do |s|

# 项目名
  s.name         = "HCKit-Swift"
# 版本号
  s.version      = "0.0.1"
# 摘要
  s.summary      = "一个简单的Swift库"
# 描述
  s.description  = <<-DESC
                    一个森罗万象的Swift库
                   DESC
# 主页
  s.homepage     = "https://github.com/chyo/HCKit-Swift"
# 证书
  s.license      = "MIT"
# 作者
  s.author             = { "ChenHongchao" => "xmchc@hotmail.com" }
# 平台
  s.platform     = :ios, "8.0"
# Swift版本
  s.swift_version = "4.0"
# 来源
  s.source       = { :git => "https://github.com/chyo/HCKit-Swift.git", :tag => "#{s.version}" }
# 源代码
  s.source_files  = "Classes/*.swift"
# 资源文件
  # s.resources = "Resources/*.png"
# 依赖系统库
  # s.framework  = "SomeFramework"
  # s.frameworks = "SomeFramework", "AnotherFramework"
  # s.library   = "iconv"
  # s.libraries = "iconv", "xml2"
# ARC
  s.requires_arc = true
# XC配置
  # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
# 依赖库
  # s.dependency "JSONKit", "~> 1.4"

end

创建项目


创建一个项目,在项目中创建一个实体文件夹Classes(非group),并在其中新建一个Swift类。


image.png

关闭项目,将项目根目录中的文件全部移动到HCKit-Swift中。


image.png

项目中的实体文件夹名称Classes和刚才所创建的HCKit-Swift.podspec文件中的s.source_files需保持一致,并且如果此文件夹包含多级目录,层级关系也要保持一致。假设Classes文件夹中有二级目录,那么s.source_files就应该改为:
s.source_files = "Classes/**/*.swift"

同步GIT仓库


// 版本标签,要与HCKit-Swift.podspec文件保持一致
git tag 0.0.1
// 上传标签
git push --tags
// 添加文件
git add .
// 提交
git commit -m '初次提交'
// 上传,默认合并到master主干
git push
// 校验pod文件
pod spec lint HCKit-Swift.podspec

根据校验的结果修改产生的错误,WARN类型的警告可以选择性处理,其他常见的一些错误:

Could not find remote branch 0.0.1 to clone.
// 无法找到版本号为0.0.1的分支/主干,执行 git push --tags 即可

The `source_files` pattern did not match any file.
The `resources` pattern did not match any file.
The `preserve_paths` pattern did not match any file.
module_map: Unable to find the specified module map file.
// 这几种错误的处理方式都是一样的,主要是podspec中配置的路径与实际路径不一致所导致的,
// 如果确认路径无误,那么需要重新设定.podspec文件中的s.version,
// 重新执行上述“同步GIT仓库”的操作,tag需要与s.version保持一致。

The validator used Swift 3.2 by default because no Swift version was specified. To specify a Swift version during validation, add the `swift_version` attribute in your podspec. Note that usage of the `--swift-version` parameter or a `.swift-version` file is now deprecated.
// 这个主要是因为Swift版本引起的,需指定代码运行的Swift版本
// 打开.podspec文件,添加 s.swift-version = '4.0.0'

如果通过校验,则会提示

 -> HCKit-Swift (0.0.1)

Analyzed 1 podspec.

HCKit-Swift.podspec passed validation.

执行lint操作后根据cocoapods的安装目录,可以在本地文件夹中找到代码库

~/Library/Caches/CocoaPods/Pods/External

其他的一些操作(非必须)

// 删除版本标签
git tag -d 0.0.1
// 拉取代码
git pull

发布到Cocoapods


注册trunk,注册成功会在邮箱中收到一个验证地址,验证成功后就可以查看自己的个人信息。

pod trunk register 电子邮件 '用户名' --verbose
// 邮箱验证后,执行
pod trunk me

最后直行push操作将库上传到pods中,注意库的名称不能与其他人重复,否则会提示 xxx库的作者是xxxx。

pod trunk push

// 上传结果,这个过程需要一段时间
// [!] Found podspec `HCKit-Swift.podspec`
// Updating spec repo `master`
// Validating podspec
//  -> HCKit-Swift (0.0.3)
// Updating spec repo `master`
// --------------------------------------------------------------------------------
// 🎉  Congrats
// 
// 🚀  HCKit-Swift (0.0.3) successfully published
// 📅  May 21st, 20:53
// 🌎  https://cocoapods.org/pods/HCKit-Swift
// 👍  Tell your friends!
// --------------------------------------------------------------------------------

此后每次版本变更需要执行以下几个步骤:

1. 变更.podspec文件的s.version
2. 同步GIT仓库,tag与s.version保持一致
3. trunk push

trunk成功后如果搜索不到自己的库,可以重新同步下pods代码

pod setup

如果setup之后依然搜索不到,那么需要重新建立检索文件

// 进入 /Users/用户名/Library/Caches/CocoaPods 文件夹删除search_index.json
// 执行
pod search HCKit-Swift
image.png

删除发布到cocoapods的框架

pod trunk delete 框架名称 版本号

CommonCrypto


在Swift中使用CommonCrypto库一般有两种方式,一种是建立桥接文件,一种是使用modulemap。我用的是modulemap的方式,模拟器和真机编译一切都正常,但是校验podsepc的时候提示了失败。

// 没配置相关信息的时候提示
no such module 'CommonCrypto'
// 配置了s.module_map、s.preserve_path、s.xcconfig的时候提示
HCKit-Swift/Classes/Extension/String+HCExtension.swift:10:8: error: could not build Objective-C module 'CCommonCrypto'

在stackflow上看了好多方法都不管用,最后终于找到了方案,记住,podspec中的 s.module_map = "xxxx" 这个是无效的,无效的!
在根目录创建文件夹Module,在文件夹中创建空文件(Other/empty),命名为module.modulemap,编辑文件:

module CommonCrypto [system] {
    header "/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}

在项目的Build Settings中找到Import Paths,设置其值为$(PROJECT_DIR)/Module,编译,这时候就可以正常引用了 import CommonCrypto。
打开.podspec文件,修改source_files、preserve_path、xcconfig:

// modulemap要配置在source_files中,配置在module_map中不起作用
s.source_files  = "Classes/**/*.swift", "Module/*.modulemap"
s.preserve_path = "Module/module.modulemap"
s.xcconfig = { "SWIFT_INCLUDE_PATHS" => "$(PODS_ROOT)/HCKit-Swift/Module"}

接下来就是打版本标签,提交,校验即可。

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