在SDK开发中,一般会需要经过几个流程,开发SDK,测试SDK,把SDK交付给使用人员,这些东西看似步骤多,过程繁琐,而且每修改一次SDK就需要重复一次上述的过程,增加了一些不必要的操作。当然,如果我们在SDK设计之初就有一个好的项目架构,就可以极大简化开发流程,提高开发效率,本文将带读者一步一步设计搭建一个个人认为比较好的SDK开发架构。
创建基本的工作空间
工作空间这个概念对于很多人并不陌生,平时使用得很多的CocoaPods
里面其实就使用到了工作空间,具体一些原理在我的另外一篇博客。
打开Xcode->New->Workspace
,命名为JSDSDKDemo
为我们的工作空间建立一个目录,因为新建工作空间后,只会为我们生成一个工作空间文件,并不会自动建立目录。
在我们的工作空间文件同级目录下建立一个用于存放子项目的SubProject
目录。
打开我们的JSDSDKDemo
,新建一个项目,命名为JSSDKForDevelop
,该项目主要用于SDK的测试,记得选择添加到JSDSDKDemo
,最好不要选自动创建git仓库
然后我们用同样的方法新建一个名为JSSDKInterfaceDemo
,该项目用于给SDK使用者作为参考。
添加静态库相关依赖
很多开发者都是把SDK打包之后,然后拿到相关Demo里面进行测试,但是其实我们只需要添加相关依赖,就可以直接在Demo里面进行测试,只需要为它们创建依赖关系。
创建一个静态库项目,命名为JSDSDK
,显而易见,该项目是该工作空间中的主要项目。
为了工程的统一性,我们的SDK项目放在和SubProject
同一级目录下。为了后续把SDK放到另外一个git模块上面去,我们可以为该SDK创建git工程。
使用Add文件的方式把JSDSDK
添加到JSSDKForDevelop
里面,注意选Creat folder reference
而不是选Create groups
选择JSSDKForDevelop
项目,在Build Phases
-Tatget Dependencies
添加JSSDK
依赖。
当然,有了这个还不足够,我们还需要在Header Search Paths
里面添加SDK的路径。
然后,我们在JSSDKForDevelop
项目里面引用SDK项目的头文件并使用,我们可以看到可以正常使用,不会报路径相关的错误了,说明依赖没有问题。
使用脚本来简化工作
我曾经也写过一篇文章[iOS 静态库打包流程简化](http://blog.csdn.net/zhouzhoujianquan/article/details/53192597)。
本次脚本在之前的项目之上做了一些改进。
首先为JSSDK
创建一个运行脚本的target,New->Target
选择Cross-platform->Aggregate
,命名为JSSDK_Build_Script
然后创建一个脚本文件,命名为JSSDK_Build
为刚才建立的JSSDK_Build_Script
添加Run Script Phase
然后配置脚本路径
这样SDK的自动化编译打包流程完成。
如何使用该工程
首先我们在在JSDSDK
里面完成SDK相关功能的开发之后,可以直接使用JSSDKForDevelop
对SDK相关的代码进行测试。然后运行JSSDK_Build_Script
,即可把SDK进行相关的打包。
打包成功后,会把JSSDKForDevelop
的文件同步到JSSDKInterfaceDemo
。同时会在SubProject
目录下生成JSSDKInterfaceDemo
的打包文件
运行JSSDKInterfaceDemo
测试SDK相关功能是否正常,如果正常则可以把SDK交付使用。
把SDK划分到Git的子模块进行管理
当然,更进一步我们可以使用git submodule
把SDK分离出来。
添加
为当前工程添加submodule,命令如下:
git submodule add 仓库地址 路径
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)
命令执行完成,会在当前工程根路径下生成一个名为.gitmodules
的文件,其中记录了子模块的信息。添加完成以后,再将子模块所在的文件夹添加到工程中即可。
删除
submodule的删除稍微麻烦点:首先,要在.gitmodules
文件中删除相应配置信息。然后,执行git rm –cached
命令将子模块所在的文件从git中删除。
下载的工程带有submodule
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
为了方便大家学习demo,我的demo没有这样做,避免有些开发者在下载之后不能立刻使用会产生一些困扰。
最后附上Demo地址给大家学习,不足之处望批判指正。