如何製作一個CocoaPods私有庫

weixin_34075268發表於2018-04-10

最近在學習元件化相關的知識,也準備寫個專案練練手。iOS元件化的實現是利用CocoaPods製作Pod庫,主工程分別引用這些Pod庫。最終想要達到的目標是主工程只是一個殼工程,其它程式碼都在元件Pod裡,主工程只負責載入這些元件,沒有其它任何程式碼。

這篇文章作為元件化開發的前置文章總結一下如何製作一個CocoaPods私有庫。

下面通過一個例子來講解整個步驟流程。

1、開啟終端,進入到要建立私有庫工程的目錄,執行pod lib create MMUtils,MMUtils為專案名
5182014-16e588164efe067d.png

這裡會詢問幾個問題,答案根據實際情況具體設定

5182014-e78266b058323640.png

命令執行完成後會建立一個私有庫工程。

2、建立私有庫Git地址,這裡以GitHub為例
5182014-99fb8c3fb038861e.png

MyGitHubModule是我自己建立的一個Organization,為了方便元件的統一管理。

3、修改配置檔案MMUtils.podspec
#
# Be sure to run `pod lib lint MMUtils.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'MMUtils'
  s.version          = '0.0.1'
  s.summary          = 'MMUtils is some utils for My Project.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
TODO: Add long description of the pod here.
                       DESC

  s.homepage         = 'https://github.com/MyGitHubModule/MMUtils'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'anotherchase@gmail.com' => 'AnotherChase@gmail.com' }
  s.source           = { :git => 'https://github.com/MyGitHubModule/MMUtils.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '8.0'

  s.source_files = 'MMUtils/Classes/**/*'
  
  # s.resource_bundles = {
  #   'MMUtils' => ['MMUtils/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  s.dependency 'Reachability', '~> 3.2'
  s.dependency 'ReactiveCocoa', '~> 2.5'
end

podspec檔案的詳細說明可以看Podspec Syntax Reference

4、開啟終端,進入Example資料夾,執行pod install,安裝依賴項
5182014-327fe3a70ffc081b.png
5、新增庫的原始碼檔案

將原始碼檔案放入MMUtils/Classes檔案下,與podspec檔案中的配置要保持一致。這裡我是放入了一個監聽網路狀態變化的工具類。

5182014-3d2a4e92e304f935.png

執行pod install,讓工程載入新新增的類。這裡需要注意的是,只要新增加類、資原始檔或依賴的第三方庫都需要重新執行pod install來進行更新。

6、新增測試程式碼,執行工程測試

在MMViewController中新增測試程式碼

#import "MMViewController.h"
#import <MMUtils/MMReachabilityHelper.h>
#import <ReactiveCocoa/ReactiveCocoa.h>

@interface MMViewController ()

@property (nonatomic, strong) UILabel *statusLabel;

@end

@implementation MMViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.statusLabel = [[UILabel alloc] initWithFrame:CGRectMake(([UIScreen mainScreen].bounds.size.width - 100) / 2.0, 100, 100, 100)];
    self.statusLabel.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:self.statusLabel];
    
    RAC(self.statusLabel, text) = [RACObserve(ReachabilityHelper, networkStatus) map:^(NSNumber *networkStatus) {
        return networkStatus.integerValue == NotReachable ? @"無網路" : @"有網路";
    }];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

執行工程測試,切換網路狀態,可以看到label文字的變化。

7、執行pod lib lint MMUtils.podspec驗證私有庫正確性
5182014-822b6ce1e3305a71.png

如果出現

[!] MMUtils did not pass validation, due to 15 warnings (but you can use `--allow-warnings` to ignore them).
You can use the `--no-clean` option to inspect any issue.

可以執行pod lib lint MMUtils.podspec --allow-warnings來忽略警告。

8、提交原始碼到GitHub,並打tag

在專案工程檔案下執行以下命令:

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master x [20:41:30] 
$ git remote add origin https://github.com/MyGitHubModule/MMUtils.git

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master x [21:01:06] 
$ git add .

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master x [21:01:17] 
$ git commit -a -m "0.0.1"

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master o [21:01:24] 
$ git pull origin master

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master o [21:01:38] C:1
$ git push origin master

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master o [21:01:59] 
$ git tag 0.0.1

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master o [21:02:08] 
$ git push origin 0.0.1

執行完成後,可以去GitHub上對我們的提交進行檢視。

9、釋出私有庫

對於開源庫,podspec檔案是放在CocoaPods的Specs專案下的。

5182014-56ea6a4d6b99ae88.png

因為我們建立的是私有庫,所以我們需要建立自己的Specs管理庫。

建立一個Git庫命名為MMSpecs,建立過程和第二步一樣。

開啟終端,執行

$ pod repo add MMSpecs https://github.com/MyGitHubModule/MMSpecs.git

執行成功後,可以看到在本地生成了MMSpecs目錄。

5182014-de767afcd5652969.png

執行

# chenjb @ chenjbdeMBP in ~/Desktop/MyGitHubModule/MMUtils on git:master o [21:58:28] 
$ pod repo push MMSpecs MMUtils.podspec 

進行釋出。

如果沒通過,可以試試pod repo push MMSpecs MMUtils.podspec --allow-warnings忽略警告。

成功之後可以在GitHub上對MMSpecs進行檢視。

10、在自己專案中引用私有庫

Podfile如下:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/MyGitHubModule/MMSpecs.git'
platform :ios, ‘8.0’

target “TestTest” do
pod 'MMUtils', '~> 0.0.1’
end

這裡很尷尬,發現開源庫中也有個同名的庫。

5182014-02eb9e7de7351266.png

修改Podfile為:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/MyGitHubModule/MMSpecs.git'
platform :ios, ‘8.0’

target “TestTest” do
pod 'MMUtils', :git => 'https://github.com/MyGitHubModule/MMUtils.git', :tag => '0.0.1'
end

讀者朋友這個操作就不要學了。

具體步驟流程就是這樣了,這是我2018年的第一篇部落格,希望自己在2018年接下來的日子裡也能繼續努力。大家共勉。

本文示例程式碼下載:MMUtils

參考連結

相關文章