使开源库同时支持CocoaPods和Carthage集成

几经波折终于弄好了让一个开源库即支持CocoaPods集成又支持Carthage集成,完整的项目:https://github.com/shinancao/ImageCycleScrollView,以供参考。下面记录一下这个过程中踩到的坑。

目录结构的设计

一开始把目录结构设计好很重要,否则在后面发现不对的时候,很有可能就要在github中把原来的仓库删掉,再重头新建一次,我就在实施的过程中删除了3、4次,最后才弄好。下面是几点要注意的:

  • 确定你的这个开源库的名字是否已经被用于发布到CocoaPods中,如果是,需要再重新想一个。运行pod setup,更新一下本地的CocoaPods Specs,然后运行pod search 项目名,看名字是否在其中。
  • 一开始创建项目的时候,就创建一个Cocoa Touch Framework的项目,开源库的名字叫什么,项目的名字就叫什么,不要创建Single View Application的。如果创建了Single View Application的,命名还叫项目的名字,那后面Framework就没得叫了。如果命名为XXXDemo,虽然Framework可以正常的叫,但是会在涉及到项目路径配置的地方都来个xxxDemo.git,难免不爽。创建一个Cocoa Touch Framework的项目后,可以再添加一个Single View Application类型的Target叫XXXDemo

那么,在开始进行CocoaPods和Carthage集成前,我摸索出的,目前认为比较好的目录结构如下:

注意文件要选择到相应的Target中,不要弄错了。

依赖第三方库

如果你的库没有依赖其他第三方的库,那就变得容易多了,上面的目录结构搭建好后可以直接进行CocoaPods和Carthage的相应操作了。如果依赖了其他库,这里要注意一下,用Carthage来集成该第三方库,不要用CocoaPods。对于CocoaPods,在podspec(还不知道podspec是啥?最后面会再说一下支持CocoaPods和Carthage集成的操作过程。)中可以指定s.dependency "",这样在别人用CocoaPods集成时,CocoaPods会将依赖的第三方库一同下载下来并配置好。但是对于Carthage没有地方可以这样指定,所以只能曲线救国一下,在集成第三方库时,使用carthage update --use-submodules。加上了--use-submodules标志后,Carthage在下载完成后,会将其作为git submodules进行依赖。然后把原工程的xcodeproj和第三方库的xcodeproj合并成一个xcworkspace,这样在别人用Carthage集成时,除了会把自己的开源库下载下来,也会把依赖的第三方库同时下载下来。

加入Travis CI

你一定已经在很多github上的项目里看到过这个图标吧。

Travis可以对github上的项目进行持续构建,集成它的步骤也很简单,到官网注册:https://travis-ci.org/,进行github帐号关联,然后在项目里添加.travis.yml文件,在该文件中指定编译环境等。我在尝试的过程中,改了好多次才最终编译成功了。配置这个文件有几个要注意的坑:

  • Travis默认使用xctool进行编译,但是xcode的版本指定的是8.0以上,xctool已经不支持了。需要指定用xcodebuild编译。
  • /Users/travis/.travis/job_stages: line 156: shell_session_update: command not found这个错误可以忽略,如果编译失败,先排查一下其他问题。
  • 如果用Carthage集成第三方库了,要进行Carthage的相关指定。

下面是我这个用Swift开发的库的.travis.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
language: objective-c
osx_image: xcode8.3
xcode_workspace: ImageCycleScrollView
xcode_scheme: ImageCycleScrollView
xcode_sdk: iphonesimulator10.3
before_install:
- xcodebuild -showsdks
- brew update
- brew outdated carthage || brew upgrade carthage
before_script:

- carthage bootstrap
before_deploy:

- carthage build --no-skip-current
- carthage archive $FRAMEWORK_NAME
script:

- xcodebuild clean build -sdk iphonesimulator10.3 -workspace ImageCycleScrollView.xcworkspace -scheme ImageCycleScrollView CODE_SIGNING_REQUIRED=NO

支持CocoaPods

  • 添加{project}.podspec文件:pod spec create ImageCycleScrollView
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Pod::Spec.new do |s|

s.name = "ImageCycleScrollView"
s.version = "2.0"
s.summary = "A cycle scrollview in swift supporting autoplay and manual play."
s.homepage = "https://github.com/shinancao/ImageCycleScrollView"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "shinancao" => "shinancao666@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/shinancao/ImageCycleScrollView.git", :tag => "#{s.version}" } # 用tag作为发布版,远程服务器上一定要有这个tag。
s.source_files = "Sources/*.{swift,h}" # 一定要保证Sources文件夹中有文件
s.frameworks = "UIKit", "Foundation"
s.requires_arc = true
s.dependency "Kingfisher", "~> 3.0" # 上面提到的指定其他依赖库

end
  • 验证是否配置正确:pod lib lint
  • 打一个spec文件中配置的tag,然后推送到远程服务器。
  • 提交spect文件到CocoaPods的官方库:

    • 如果是第一次使用,需要先注册:

      1
      pod trunk register *youremail*@gmail.com '*yourname*' --description='iMac' --verbose

      然后到邮箱中验证一下,注册成功后,可以用pod trunk me查看注册信息和发布过的Pods。

    • 提交{project}.podspec文件:pod trunk push ImageCycleScrollView.podspec

至此,操作完毕,可以像使用其他Pods那样使用自己的啦。

支持Carthage

  • 将需要Carthage编译的schemes设置为Shared

  • 验证编译是否有错误:carthage build --no-skip-current
  • 提交tag到远程服务器,Carthage会自动来检测可以编译成功的tag,tag的命名用简单的数字即可,夹杂着字符Carthage有可能识别不出来。

至此,就操作完毕啦。

完善README

最后,再美化一下README.md,看起来会正宗一些,哈哈。

=========================11月1日更新==========================

弄了一个生成同时支持Cocoapods和Carthage的工程模板,一键生成,让自己专注在源码上:
https://github.com/shinancao/pod-carthage-template