CocoaPods 组件化 实践

2017/03/21

1.创建WorkSpace包含主工程和业务模块FrameWorks

在没有CocoaPods情况下,用Xcode管理多个project的方式。

  1. 创建一个文件夹 WorkSpace
  2. 通过 Xcode -> File -> New -> WorkSpace 创建一个 WorkSpace.xcworkspace 放在生成好的WorkSpace目录中
  3. 创建一个主工程main放到在WorkSpace目录中
  4. 创建一个Frameworks工程Login放到在WorkSpace目录中
  5. 这时WorkSpace目录中有一个WorkSpace.xcworkspace和两个工程目录。
  6. 打开WorkSpace.xcworkspace将两个工程的工程文件 Main.xcodeprojLogin.xcodeproj拽入WorkSpace.xcworkspace中。
  7. 在这里不会发生仅导入工程文件丢失其他文件的问题,因为已经都将两个工程的文件放到了WorkSpace目录里了。
  8. 添加编译依赖只需要在Main主工程的General的Embedded Binaries里选择业务模块工程生成的Framework就可以了。
  9. 编译运行。

2.利用CocosPod在本地维护这些子模块

现在本地尝试用CocosPod管理Framework,确定无误再传到自己的Github,让团队里其他的小伙伴可以线上获取Framework

  • Framework工程中生成Pod用来管理描述Framework源码和资源的组织方式的描述文件 xxxx.podspec。之后其他工程再需要这个Framework时只要找到这个描述文件就知道如何导入这里面的源码了。
    • cd Login //进入Framework工程
    • pod spec create Login //生成Framework的描述文件
Pod::Spec.new do |s|
  s.name         = "Login"
  s.version      = "0.0.2"
  s.summary      = "A short description of Login."
  s.description  = "A description for Login Framework"
 s.homepage     = "http://EXAMPLE/Login"
  s.license      = "MIT"
  s.author             = { "Xiao Gang" => "huangzhigang1024@qq.com" }
  s.source       = { :git => "https://github.com/callmebill/Login.git", :tag => "#{s.version}" }
  s.source_files  = 'Login/Source/`.swift'
  s.resources = 'Login/Resources/`.{png,xib,storyboard,xcassets}'
end
  • 在主工程中生成Podfile描述需要导入哪些Framework
    • cd Main && pod init //生成Pod的依赖管理文件
    • 添加 Login 子模块,并指定本地Login.podspec路径
    • pod install //安装依赖
target 'Main' do
  use_frameworks!
  pod 'Login', :podspec => ‘../Login/Login.podspec'  
end

3.搭建私有cocoapods仓库

这一步做的是,将描述文件Login.podspecFramework源码都上传到Github,让团队里其他的小伙伴可以线上获取Framework

  1. 在Github上创建Framework项目仓库 Login.git
  2. 在Github上创建管理Login.podspec描述文件的私有仓库 XGSpecs.git
  3. cd Login //进入Framework工程
  4. pod lib lint //先检查podspec的有效性,并处理所有错误和警告
  5. git tag 0.0.2 & git push --tags //podspec验证无误后,上传Framework工程到Github并打上tag
  6. pod repo add XGSpecs https://github.com/callmebill/XGSpecs.git //添加刚刚创建的私有仓库到本地。
  7. pod repo push XGSpecs Login.podspec//将Framework工程的podspec文件传到私有仓库中管理。
  8. 将私有Spec仓库的地址soucre放到Podfile中
  9. 最后pod install
#先搜索私有仓库,再查找CocoaPods仓库。
source 'https://github.com/callmebill/XGSpecs.git' 
source 'https://github.com/CocoaPods/Specs.git'

target 'Main' do
  use_frameworks!
  pod 'Login' 
end

4.利用CocosPod将组件二进制化提高编译速度

  1. 将生成好的Login.framework 放到工程路径下。
  2. 添加 s.vendored_frameworks = 'Login/Login.framework'Login.podspec
  3. 因为Login.framework已经包含了资源,所以去掉s.resources
  4. 因为不需要源代码,所以去掉s.source_files

注意:

  1. 每次修改Pod工程 一定要打上tag!!!CocoaPods是通过tag获取git版本的。
  2. 选用稳定的CocoaPods 1.1.1版本。之前用的 CocoaPods 1.2.1.beta.1 有缺少xcscheme的bug。
  3. $ lipo –create /Debug-iphoneos/Someframework.framwork/Someframework Debug-iphonesimulator/Someframework.framwork/Someframework –output Someframework
  4. 在用pod lib lint检测和pod install安装时,加上 –verbose 命令查看具体过程,发现问题。
  5. 必要时删掉主工程的Pod文件,并pod cache clean --all重新尝试 pod install
  6. 不要忘记将修改后的Login.podspec提交到私有XGSpecs.git
Pod::Spec.new do |s|
  s.name         = "Login"
  s.version      = "0.0.3"
  s.summary      = "A short description of Login."
  s.description  = "A description for Login Framework"
 s.homepage     = "http://EXAMPLE/Login"
  s.license      = "MIT"
  s.author             = { "Xiao Gang" => "huangzhigang1024@qq.com" }
  s.source       = { :git => "https://github.com/callmebill/Login.git", :tag => "#{s.version}" }
  # s.source_files  = 'Login/Source/`.swift'
  # s.resources = 'Login/Resources/`.{png,xib,storyboard,xcassets}'
  s.vendored_frameworks = 'Login/Login.framework'
end

下次Pod再被拉取时,就只有Login/Login.framework.没有资源文件和源代码。

5.发布项目到CocoaPods

Post Directory