如何使用Carthage管理iOS依赖库

作者: leacode | 来源:发表于2016-02-17 17:11 被阅读32210次



    前言

            很多ios开发者大概对CocoaPods并不陌生,我们几乎已经习惯了在pod文件中添加一行即可将一个库导入到自己的工程中,不得不说,在ios开发的历史中CocoaPods功不可没,即便在未来它也会在开发者中占据半壁江山。但是在这里我向大家介绍一个新的第三方库管理工具-Carthage,不管你是菜鸟还是老鸟,都希望这篇文章能为你打开一个新的世界。

            很多人会问了,自己用CocoaPods意境习惯了,并没有发现什么不妥,为什么要使用carthage呢? 所以为了解开大家的疑问,我会首先介绍这两个第三方库管理工具的不同,让大家对这颗刚刚崛起的新星有一个初步的了解。

          说到Carthage,就要先说swift,2014年苹果发布swift初期,用swift编写的第三方库就只能通过拖动源代码到自己的项目中才能被调用, 由于当时只有寥寥无几的开源库,且不能打包,加上swift1.0并不是那么好用,许多人对swift持着观望的态度。随着swift逐步趋于稳定,并且从ios8.0开始支持将自己写的swift打包成framework,越来越多的纯swift编写框架开始出现,就在这时候carthage突然出现在人们的视野中,而且陆陆续续几乎所有的开源框架都开始支持carthage。

          Carthage的github主页为  https://github.com/Carthage/Carthage.git   里面其实对大家的疑问都有着详尽的解答,介于一些朋友英文不太好,这里我就用中文介绍一下Carthage和CocoaPods的不同:

          首先,CocoaPods会直接创建和修改项目的workspace配置,一切都是为了便捷,我们只需要修改pod文件并不需要过多的关心其他事情,CocoaPods创建的是高度集成的项目。 而Carthage的特点是灵活,耦合度不高,集成时不需要集成相应的project,不需要创建workspace,而仅仅需要依赖打包好的framework文件即可。

          其次,CocoaPods相对来说功能要比Carthage多很多,在国内由于墙的原因,我们都改成了淘宝的源来更新CocoaPods,相信我,如果你不翻墙,很多东西还是不能用,更新不下来,版本错误等一系列原因会让你不得不放弃一些看起来非常好用的第三方库。而Carthage似乎只需要从github上下载项目即可,配置更是简单,使用的时候项目干干净净,所有的第三方库就像苹果原生的framework一样美好,从此你不再需要担新CocoaPods的库用不了,不用花大量时间去修复用CocoaPods打包时出现的各种问题,如果你用过CocoaPods,当你开始用Carthage的时候,你会爱上这个工具的。


    安装使用Carthage

          好了,说了这么多,下面我就开始介绍如何使用Carthage.

    安装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

    (感谢@TommyYaphetS指出新版本的问题,如果文章有误或者大家使用时有任何问题可以给我留言)

    如果你使用的是0.11之后的版本,可能会报错:

    /bin/sh failed with exit code 1

    你需要使用下面的方式来配置即可:

    此时,你已经可以使用导入的第三方库了

    如需要使用Alamofire和SwiftyJSON,就在相应的类前添加

    import Alamofire

    import SwiftyJSON

    即可。

          现在,就开始享受Carthage吧。

    如有疑问可以给我发邮件: lichunyu@vip.qq.com

    另外推荐我开发的纯swift  coredata库  https://github.com/leacode/LCYCoreDataHelper.git , 已支持使用Carthage, 喜欢的话给个❤️吧。

    相关文章

      网友评论

      • 清蒸鱼跃龙门:能不能帮我看下我这个问题
        http://www.cocoachina.com/bbs/read.php?tid-1735403.html
        leacode:@清蒸鱼跃龙门 看了一下,在build settings的header search paths里面有相关的路径,都是指向最上级SDK目录下的,可能是编译之后会有相应的framework文件,也有可能就是他没有放
        清蒸鱼跃龙门:@leacode 腾讯直播的第三方库,我在他的demo里看到的。然后按照常规方式找不到他这个项目里怎么集成的这个库,正常是一个包的图标可以右键访问这个包的路径,他这个右键只能打开项目所在根目录 很好奇!这是demo下载地址
        http://liteavsdk-1252463788.cosgz.myqcloud.com/4.5/TXLiteAVSDK_Professional_Rename_iOS_4.5.4018.zip?_ga=1.181701732.296073329.1519955132
        leacode:@清蒸鱼跃龙门 那个白色的是什么库呢,有可能是找不到路径,也有可能是仅仅文件名是framework但是实际上不是动态库
      • SuperMarioGG:这种方式不适合动态库
        leacode:@caimterZhu 另外,如果carthage不可以,用cocoapods也同样不可以的,这只是一个管理依赖的工具,最终打包的形态都是一样的。
        SuperMarioGG:@leacode 我用Carthage导入RMQClient。提交商店审核总是说我包含了x86和i386架构,然后我就用lipo把架构分离开,然后又是说什么bundle问题。搞得我死活提交不了商店呀
        leacode:使用的就是动态库哦,swift1.0, 2.0的时候是不支持动态库的,后面支持之后就很方便了,Carthage以及苹果的Package Manager都是通过添加对动态库的依赖来集成外部的库,如果想要做一个私有库也是比较方便的,类似于cocoapods的podfile,主流的框架都会支持这三种集成方式。
      • 不喜欢说话的小张同学:大佬 。 最后一部还需要手动配置???这个和cocoapods相比又什么优势???
        leacode:@牛奔奔 其实我个人还是比较喜欢cocoapods 的,但是这个比较轻,不需要弄workspace, 使用第三方库也跟系统库一样的方式使用,我写小App就用这个,熟练了有时候比配pods还快
      • SHyH5:怎么判断第三发的库是否支持carthage
        leacode:@SHyH5 没有哦,但是主流的框架都是支持的
        SHyH5:@leacode 好的。他有没有 像pod search这样的直接搜索的命令
        leacode:@SHyH5 第三方库的readme都会写的,和cocoapods一样,还有源文件里会有一个.travis.yml文件,这是配置文件
      • 尼古拉斯骄傲:8.3.3一直报错
      • 风行天下武帝:linker command failed with exit code 1 (use -v to see invocation)报这个错误,我的carthage版本0.24.0 /usr/local/bin/carthage copy-frameworks这个设置也是对的,为什么还报错啊,谢谢
      • 小小云x:请问大神这是为什么? dyld: Library not loaded: @rpath/SnapKit.framework/SnapKit xxxxxxxx Reason: Incompatible library version: SwiftPractice requires version 1.0.0 or later, but SnapKit provides version 0.0.0
      • paydrin:为什么OC项目不行?
        Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.
      • LD_左岸:我如果创建的是OC的项目 不是Swift的项目 能用Carthage管理吗
        现在我用Carthage导入了framework 但是一直运行不起来
        一直报这个错
        dyld: Library not loaded: @rpath/TextToSpeechV1.framework/TextToSpeechV1
        Referenced from: /Users/liyangyang/Library/Developer/CoreSimulator/Devices/348149D2-67A8-4168-93E4-46319B01255F/data/Containers/Bundle/Application/1DC11688-D3E3-43E2-945B-44468001B0AA/buliceliTest.app/buliceliTest
        Reason: image not found
        (lldb)
        请大神指导🙏
      • LD_左岸:3、使用xcode打开hartfile文件报下面这个错
        The application /Users/lidashen/Library/Developer/Xcode/DerivedData/xcode-caeknqrhahnnxefhvzvwllqrcewi/Build/Products/Debug-iphoneos/xcode.app cannot be opened because it has an incorrect executable format.
        leacode:@左岸__ 因为文件格式不对,检查一下吧
      • 饥人谷_张炜:楼主你好 请问下下载库的时候 回报这样一个错误请问怎么解决 error: unable to find utility "xcodebuild", not a developer tool or in PATH
      • Zaki丶:兄弟 SwiftyJSON 在 swift3.1中无法下载 该怎么办 ....
      • 小九喵喵:请问 所有可以用 cocoapods 装的开源库都可以用carthage装吗?还是其中只是一小部分
        小九喵喵:@leacode 好的 谢谢
        leacode:@themachine15 只要github的温文档里有说明怎么集成Carthage 就可以,基本上大部分开源库都支持的,国产的开源库支持较少
      • lyonse:每次只要已修改bundleId 就会出现类似的错误,你有没有遇到过啊?
        Failed to load Info.plist from bundle at path /Users/lyonse/Library/Developer/CoreSimulator/Devices/F05EED10-6506-4CDB-9C46-7C80F9C407D1/data/Library/Caches/com.apple.mobile.installd.staging/temp.3ZWJYO/extracted/Payload/AutoAlliance.app/Frameworks/AEXML.framework
        饥人谷_张炜:@lyonse 楼主你好 请问下下载库的时候 回报这样一个错误请问怎么解决 error: unable to find utility "xcodebuild", not a developer tool or in PATH
        lyonse:@leacode 我解决了,应该是因为carthage获取的bundleid不正确造成的原因。工程clean,删掉项目之后再run就好了,并且bundle必须不能在编辑状态下
        leacode:@lyonse 把报错的这个文件夹里的东西删掉,然后clean一下项目重新编译一下,应该就好了
      • a7642f69975b:*** Skipped building MJRefresh due to the error:
        Dependency "MJRefresh" has no shared framework schemes for any of the platforms: iOS
        这个库不能编译成功啊!
      • 靠脸吃饭的帅毅:写的棒棒哒
      • 爱吃土豆的菇凉:重新更新cartfile,工程里面的库还需要重新拖入 Linked frameworks and Binaries吗
        leacode:@爱吃土豆的菇凉 不需要的,有新库的话就需要配置一下,只是更新就不用的
      • 2b1ed5b649ed:完成第5步,就可以使用动态库了,为什么还需要进行之后的步骤 :yum:
        leacode:@七夜_ 文章最后修改是0.11版本,是需要加上script 的,如果新版不需要加了我会查看一下更新文章的。
      • EdLiya:受益了 !
      • 遗忘的黑鹰:如何解决module compiled with swift2.x cannot be imported in swift 3.x?只有等到这个库使用指定的swift版本么,而且版本还需要完全一致? 刚开始使用carthage,求赐教
      • 断忆残缘:博主,写的配置方法有错误
        leacode:@断忆残缘 在我后面修正的里面是可以的
      • revon:已经装了cocoapods的,装Carthage,需要卸载cocoapods么?
        6585f9d7f147:@revon xcode-preference-location-command line tools change to "Xcode 8.1",have a try.
        revon:@leacode 升级了xcode到8.0.1提示alamofire是用swift3.0编译的,不能再swift3.0.1中导入,这样的话,是需要在从新编译一个alamofire?
        leacode:@revon 不需要的,这两者不冲突,可以同时使用
      • 31b5106b1b05:Build下无任何文件
        一抹相思泪成雨:我的也是空 怎么解决???
      • 31b5106b1b05:7.2里面有Linked Frameworks and Libraries,?我怎么没找到
      • 31b5106b1b05:现在0.16了
      • TommyYaphetS:LZ,你shell那里设置错误了,请参考这个:https://github.com/Carthage/Carthage/issues/1079
        leacode:@TommyYaphetS 再次感谢,我已经测试好更新了,如果用新版的用下面的配置即可。
        leacode:@TommyYaphetS 嘿,我写这篇文章的时候是0.11,后面应该是到了0.12版本的时候出了这个错误,我会升级一下然后试一下,再修改一下文章,谢谢。
        leacode:@TommyYaphetS 我这里是好用的,我会检查一下你的链接做下修改,谢啦
      • 哲人王:carthage不支持按照自己需求定制修改库的源文件吧
        leacode:@哲人王 我主要用作swift项目的开发,需要我调整的库我可以写extension,如果需要大改,把源码copy到工程中即可
        哲人王:@leacode 当你用些UI库做微调岂不是要地上滚来滚去
        leacode:@哲人王 不支持,只提供最简单直接的打包方式
      • newbiecoder:最后一步 到底怎么弄 我编译成功 运行 就甭
        leacode:@newbiecoder 名字和路径要写对
        newbiecoder:Run script 这个加了以后编译不了了,
        leacode:@newbiecoder 编译之后,把.framework文件加入到 Linked Frameworks and Libraries, 然后加入 Run script就可以了

      本文标题:如何使用Carthage管理iOS依赖库

      本文链接:https://www.haomeiwen.com/subject/tzbpkttx.html