现状
CocoaPods 由于完全使用静态链接解决方法,过度依赖 Objective-C ,目前应该是官方 repo 有提到是 -Xlinker error , 这个问题之前我也遇到过,无解。除非手工执行 ar 不用 ld 和 libtool。
小伙伴有用子目录的方法引用代码,貌似不错,还有就是直接用 git submodule,看起来维护性也可以。
简单解决方案
一个良好的第三方库应该实现为 Cocoa Touch Framework (实际内容为 Header + 动态链接库)。而不是直接把 Swift 代码 Copy 过来放入自己的项目。这里以一个简单项目为例,介绍如何科学使用。
目标描述
用 Swift 创建一个 Demo ,使用 SwiftyJSON 和 LTMorphingLabel 库。
项目的名字叫 DemoApp 。
创建 Workspace
创建一个 Workspace ,名字随意,位置能找到就好。这个 Workspace 主要用来管理我们的项目及其依赖的第三方库。
创建 DemoApp
在 Workspace 创建一个 App ,因为是测试所以我选了 Single View Application 。
引入 SwiftyJSON
SwiftyJSON 是一个 Cocoa Touch Framework ,可以直接使用, git clone 后,添加项目到 Workspace 即可。
尝试 *** 作发现,最容易最不会出错的方法就是直接从 Finder 里把 .xcodeproj 文件拖动到 Workspace 。
引入 LTMorphingLabel
LTMorphingLabel 是一个 App Deme 式项目。其中 Label View 的实现在一个子目录中。可以采用创建 Cocoa Touch Framework 的方法来引入这几个文件。
当然也可以直接把目录拖到我们的 DemoApp 里,不过太原始粗暴了。
为 App 添加依赖
在 DemoApp 的 Genral 选项卡中,添加 Linked Frameworks and Libraries 。选择 Workspace 中 SwiftyJSON 和 LTMorphingLabel 两个 .framework 。
如果是直接选择来自其他项目的 .framework 而不是同一 Workspace ,那么这里也许还要同时加入 Embedded Binaries。
使用
添加好依赖后,就可以在 DemoApp 项目代码中 import SwiftyJSON 或者 import LTMorphingLabel 来使用对应的库。同时还可以用 Command + 鼠标点击的方法查看声明代码。
除错
比较坑爹的是,实际上按照以上方法, LTMorphingLabel 并不能正常使用,查看报错信息发现是自动生成的 LTMorphingLabel-Swift.h 有处语法无法被识别,编辑器找到 .h 文件,注释掉这行诡异代码即可。
看起来目前的 Bridge Header 和 -emit-objc-header 实现还是有问题的。小伙伴一定要淡定。
对于非 Workspace
如果不喜欢使用 Workspace ,也可以将第三方库的编译结果,一个 .framework 目录拖到项目文件里,然后添加 Embedded Binaries。
评论
创建 Cocoa Touch Framework 选项中,可以使用 Swift 代码,此时编译结果(默认)会包含 module.modulemap 文件, 之前有介绍过它的作用,通过它, Swift 可以使用第三方模块。参考 Module System of Swift (简析 Swift 的模块系统) 。
实际上这个解决方案绕了一大圈,通过 Swift 文件导出 ProjName-Swift.h、然后 module.modulemap 模块描述文件引入、然后再由 Swift 导入。
其实 .framework 同时也包含了 ProjName.swiftmodule/[ARCH].swiftmodule 不过看起来没有使用到,而且默认在 IDE 下也不支持 Swift 从 .swiftmodule 文件导入,比较坑。希望以后版本能加入支持。
.framework 包含了所有 Swift 标准库的动态链接库,小伙伴可能会以为这会导致编译后的 App 变大。其实大可放心,任何 Swift 语言的 App 都会包含这些动态链接库,而且只会包含一个副本。此方法对 App 最终的大小几乎无影响。
注: 个人测试了下,发现这个 .swiftmodule 是可以通过其他方法使用的,绕过 module.modulemap,应该是更佳的解决方案,但是需要控制命令行参数。
至于静态链接库,过时了。抛弃吧。
良第三库应该实现 Cocoa Touch Framework (实际内容 Header + 态链接库)直接 Swift 代码 Copy 放入自项目简单项目例介绍何科使用目标描述
用 Swift 创建 Demo 使用 SwiftyJSON LTMorphingLabel 库
项目名字叫 DemoApp
创建 Workspace
创建 Workspace 名字随意位置能找 Workspace 主要用管理我项目及其依赖第三库
创建 DemoApp
Workspace 创建 App 测试所我选 Single View Application
引入 SwiftyJSON
SwiftyJSON Cocoa Touch Framework 直接使用 git clone 添加项目 Workspace 即
尝试 *** 作发现容易错直接 Finder .xcodeproj 文件拖 Workspace
f
安装Carthage只需要打开终端,输入如下指令:$ brew update
$ brew install carthage
如果你不喜欢使用终端,也可以从网站https://github.com/Carthage/Carthage/releases下载最新版的Carthage.pkg来更新。
当你安装好Carthage后,在终端执行
$ carthage version
即可看到当前的carthage版本, 当写这篇文章的时候,Carthage的版本为0.11.0 。
现在,你已经安装好了Carthage,接下来就是在你的项目中使用carthage了:
1、通过终端进入到项目所在的文件夹:
$ cd ~/Path/Project
后面的路径替换成你的项目所在的路径即可
2、创建一个空的carthage文件:
$ touch Cartfile
此时你的项目文件夹里会创建一个名为Cartfile的文件。
3、使用xcode打开cartfile文件
$ open -a Xcode Cartfile
并在打开的文件中加入以下内容
github "Alamofire/Alamofire" ~>3.0
github "SwiftyJSON/SwiftyJSON"
版本的含义
~>3.0 表示使用版本3.0以上但是低于4.0的最新版本,如3.5, 3.9
== 3.0 表示使用3.0版本
>= 3.0表示使用3.0或更高的版本
如果你没有指明版本号,则会自动使用最新的版本
4、保存并关闭cart file文件,在终端执行命令
$ carthage update --platform iOS
carthage会为你下载和编译所需要的第三方库,当命令执行完毕,在你的项目文件夹中会创建一个名为Carthage的文件夹
在 ~/Carthage/Build/iOS里会出现xxx.framework文件已经为你创建好了。
当然,你也可以通过命令行进入此文件夹:
$ open Carthage
5、现在打开你的项目,点击project,选择target, 再选择上方的General,将需要的framework文件拖到 Linked frameworks and Binaries内
6、点击Build Phrase tab选项,添加相应的run script
此时,你已经可以使用导入的第三方库了
如需要使用Alamofire和SwiftyJSON,就在相应的类前添加
import Alamofire
import SwiftyJSON
即可。
现在,就开始享受Carthage吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)