用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

ppsheep發表於2017-05-11

今天將手上的SDK加入了通過CocoaPod整合,但是沒有上到pod的官方庫,是公司內部的私有庫,現在元件化很火,相信很多公司稍微大一些的專案都會有這個需求,現在我們就來講講怎麼加入pod的整合方式,這裡我就把github當做我的私有倉庫了

pod環境我就不講怎麼整合了,如果還沒整合的同學,請移步

ppsheep.com/2015/11/20/…

pod lib create

這裡我們通過pod官方提供的模板來建立,我目前也是這樣建立的,當然xcode也提供了建立靜態庫的方式,這個我就不講了,感興趣的同學可以Google一下

首先進入到我們想要存放工程的地方 通過命令:

pod lib create PPSPrivateStaticLibrary複製程式碼

這裡我將我的靜態庫取名為PPSPrivateStaticLibrary

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

這裡開始建立的時候我們會填幾個問題:

  1. What language do you want to use?? [ Swift / ObjC ] //選擇你要建立的靜態庫的語言

  2. Would you like to include a demo application with your library? [ Yes / No ] //是否需要建立一個demo用來測試你的靜態庫

  3. Which testing frameworks will you use? [ Specta / Kiwi / None ] //使用哪種測試框架來進行測試

  4. Would you like to do view based testing? [ Yes / No ] //是否要做基礎的檢視測試

  5. What is your class prefix? //檔案字首

下面是我選擇的

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

建立完成過後,我們的工程會自動開啟,建立完成後,工程的目錄如下

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

接下來我們主要編輯的是podspec檔案,首先我們來看一下,我編寫的SDK中的測試檔案結構

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

我想要公開上面檔案中的PPSPublic1和PPSPublic2的標頭檔案,其他的全部不公開出來,那我們怎樣編寫podspec檔案呢

Pod::Spec.new do |s|
  s.name             = 'PPSPrivateStaticLibrary'
  s.version          = '0.1.0'

#這裡加上你的工程簡介
  s.summary          = 'This is ppsheep‘s test'

#這裡加上你的工程簡介
  s.description      = <<-DESC
這是我的一個測試工程,用來演示怎樣建立一個原始碼不公開的靜態庫
                       DESC

#專案主頁,這裡可以放上你的靜態庫的介紹網頁
  s.homepage         = 'https://github.com/yangqian111/PPSPrivateStaticLibrary'

  s.license          = { :type => 'MIT', :file => 'LICENSE' }

  s.author           = { 'ppsheep' => 'ppsheep.qian@gmail.com' }

  s.source           = { :git => '/Users/yangqian/Desktop/demo/PPSPrivateStaticLibrary', :tag => s.version.to_s }

#最低iOS系統要求
  s.ios.deployment_target = '8.0'

#是否需要專案支援ARC
  s.requires_arc = true

#這個地方注意下,你在工程中要用到的framework,都需要在這裡宣告,我只是這裡列舉了幾個
s.frameworks = 'SystemConfiguration', 'MobileCoreServices', 'CoreGraphics', 'Security', 'CoreTelephony'

#在專案中我們還會用到一些library,也需要在這裡宣告,比如sqllite等tbd結尾的
s.libraries = 'resolv'

#這裡宣告的存放原始檔的地址,就是我們實際寫的程式碼
  s.source_files = 'PPSPrivateStaticLibrary/Classes/**/*'

#這裡可以用來存放你的資原始檔,圖片,證照等等
  # s.resource_bundles = {
  #   'PPSPrivateStaticLibrary' => ['PPSPrivateStaticLibrary/Assets/*.png']
  # }

#這裡宣告你需要公開的檔案, 有幾種宣告方式,萬用字元也支援的,在這裡我可以使用萬用字元PPSPrivateStaticLibrary/Classes/Public/*.h

  s.public_header_files = 'PPSPrivateStaticLibrary/Classes/Public/*.h'
#也可以一個一個寫出來[]
#s.public_header_files = ['PPSPrivateStaticLibrary/Classes/Public/PPSPublic1.h',
#                          'PPSPrivateStaticLibrary/Classes/Public/PPSPublic2.h']

#這裡可以宣告你的靜態庫依賴的其他靜態庫
  # s.dependency 'AFNetworking', '~> 2.3'
end複製程式碼

上面的都寫好了,接下來,我們測試一下,首先進入到剛才目錄中建立的example資料夾install一下工程

然後,我們就可以在例子中引入兩個公開的檔案


#import "PPSAppDelegate.h"
#import <PPSPrivateStaticLibrary/PPSPublic1.h>
#import <PPSPrivateStaticLibrary/PPSPublic2.h>

@implementation PPSAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    PPSPublic1 *p1 = [[PPSPublic1 alloc] init];
    [p1 public1];
    PPSPublic2 *p2 = [[PPSPublic2 alloc] init];
    [p2 public2];
    return YES;
}複製程式碼

能夠正常呼叫,我們的例子程式已經能夠正常呼叫SDK,然後我們還需要檢查一下我們的pod庫是否符合pod規則,也是通過命令列來檢測,進入到我們的工程目錄,使用命令:

pod lib lint複製程式碼

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

可能會遇到這個問題

[!] The validator for Swift projects uses Swift 3.0 by default, if you are using a different version of swift you can use a `.swift-version` file to set the version for your Pod. For example to use Swift 2.3, run: 
    `echo "2.3" > .swift-version`.
You can use the `--no-clean` option to inspect any issue.複製程式碼

因為我之前已經全域性設定過了,所以這次沒遇到這個問題,如果遇到了這個問題,在命令列執行以下

echo "3.0" > .swift-version複製程式碼

就可以解決了

其中可能還會遇到其他問題,這個就要具體情況具體分析了

驗證我們通過了,接下來,就需要打包了,pod可以打成兩種形式的包,一種framework,還有一種是.a的library,這裡我使用的是framework

也是通過命令列來執行

pod package PPSPrivateStaticLibrary.podspec --force複製程式碼

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

這裡,遇到了問題,因為我們還未將原始碼提交到git本地倉庫,tag也未打,所以報錯了

git add .
git commit -a -m '0.1.0'
git tag -a 0.1.0 -m '0.1.0'複製程式碼

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

再次執行

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

已經成功執行了

我們到工程目錄下去找

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

好了已經有了我們想要的framework,如果不放心framework是否支援所有的架構,我們可以檢測一下

lipo -info複製程式碼

注意這裡不是將framework資料夾拿來檢查,而是資料夾下面的二進位制檔案

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

可以看到,包含了所有的架構

上傳到私有倉庫

在我們生成的資料夾中,我們需要用到的兩個檔案,一個是framework,還有一個就是PPSPrivateStaticLibrary.podspec檔案

在上傳之前,我們還需要修改一下podspec檔案其中的一個地方

//將  s.source修改成我們的私有倉庫的地址
  s.source = { :git => 'https://github.com/yangqian111/PPSPrivateStaticLibrary.git', :tag => s.version.to_s}
//將s.ios.vendored_framework前的ios資料夾去掉
s.ios.vendored_framework   = 'PPSPrivateStaticLibrary.framework'複製程式碼

然後將framework和PPSPrivateStaticLibrary全部上傳到我們的私有倉庫

接下來我們就可以整合我們的pod庫了

新建一個工程,在Podfile中

workspace ‘Test.xcworkspace'

project ‘Test.xcodeproj'

platform :ios, '8.0'

target 'Test' do

pod 'PPSPrivateStaticLibrary',:git=>'https://github.com/yangqian111/PPSPrivateStaticLibrary.git'

end複製程式碼

其中地址,寫我們的私有倉庫地址

這樣就能順利整合

#import <PPSPrivateStaticLibrary/PPSPublic1.h>
#import <PPSPrivateStaticLibrary/PPSPublic2.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    PPSPublic1 *p1 = [[PPSPublic1 alloc] init];
    [p1 public1];
    PPSPublic2 *p2 = [[PPSPublic2 alloc] init];
    [p2 public2];
    return YES;
}複製程式碼

這隻能算是一個初步整合,還有很多能做,比如我還想要整合其他的第三方公開庫,或者我還要整合其他的第三方私有庫,這些,我在後面如果會用到,都會分享出來

原始碼這些我都放在了github上

github.com/yangqian111…

歡迎關注微博:ppsheep_Qian

weibo.com/ppsheep

歡迎關注公眾號

用 CocoaPod 建立私有的靜態庫 (不公開原始碼)

相關文章