iOS pod私有庫-Docker+gitlab+CocoaPods

平時我們項目開發(fā)會抽離一些公共模塊,那么這些公共模塊如何管理呢,呵呵,搭建CocoaPods私有庫來去管理是最好不過了. 由于之前工作忙沒時間整理,最近正好有些閑暇時間,我就拋磚引玉,搭建一個簡單示例,順便梳理一下流程.
??首先是環(huán)境搭建,我采用docker里面部署一個gitlab來作為私有庫倉庫,然后拿一個示例項目拆分出公共模塊,接著我會把公共模塊打包成pod,最后到項目中引用

一 Docker安裝
二 部署gitlab
三 創(chuàng)建CocoaPods私有庫
四 更新私有庫
五 問題總結(jié)
一 Docker安裝
Docker

Docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔(dān)心環(huán)境問題。
總體來說,Docker 的接口相當(dāng)簡單,用戶可以方便地創(chuàng)建和使用容器,把自己的應(yīng)用放入容器。容器還可以進(jìn)行版本管理、復(fù)制、分享、修改,就像管理普通的代碼一樣??傊愃朴谖覀兪褂玫奶摂M機,只能說很行,但是它不是,就是一個環(huán)境隔離工具,類似于iOS的沙盒, 關(guān)于Docker的使用我不到贅述,感興趣的可以找相關(guān)資料,我這里只用了很少一部分,很簡單.

步驟1 Docker下載地址https://www.docker.com/get-started

步驟2 我的是Mac環(huán)境,我下載的是.dmg,雙擊下載好的xx.dmg安裝,安裝好后是下面的界面


右上角的小鯨魚就正在運行的Docker,下面我們來驗證一下Docker是否安裝好
步驟3 驗證Docker環(huán)境
打開終端 輸入docker -v查看環(huán)境是否正常,能正常輸出版本號就沒啥問題了

OK Docker環(huán)境搭建就是如此簡單,接下來我們來部署gitlab

二 部署gitlab

步驟 1 在電腦機器上找一個目錄新建一個文件夾

步驟 2 在新建的目錄內(nèi)新建一個文件docker-compose.yml,名字不要改,這是一個docker編排文件,我們將要用docker-compose工具來部署它


步驟 3 編輯docker-compose.yml文件內(nèi)容,并保存,下面是文件內(nèi)容

version: '3'
services:
    web:
      image: 'twang2218/gitlab-ce-zh'
      restart: always
      hostname: '127.0.0.1'
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://127.0.0.1'
          gitlab_rails['gitlab_shell_ssh_port'] = 2222
          unicorn['port'] = 8888
          nginx['listen_port'] = 80
      ports:
        - '8088:80'
        - '2443:443'
        - '2222:22'
      volumes:
        - ./config:/etc/gitlab
        - ./data:/var/opt/gitlab
        - ./logs:/var/log/gitlab

步驟 4 終端切換到這個文件所在目錄下,執(zhí)行如下命令

 docker-compose up -d

文件大會下載一會,如果你網(wǎng)速不好失敗了,那就在重新執(zhí)行這個命令,當(dāng)運行完成后,我們載查看下是否部署好了
步驟 5 執(zhí)行命令查看容器是否創(chuàng)建運行

docker ps | grep twang

STATUS healty 就代表容器正常運行了,接下來我們訪問下我們的gitlab

步驟 6 訪問gitlab: http://127.0.0.1:8088/
出現(xiàn)登陸頁面

OK出現(xiàn)這個頁面我們gitlab就搭建好了,我們可以注冊賬號(自行操作吧)登陸進(jìn)去了,接下來就開始我們的私有庫創(chuàng)建了

三 創(chuàng)建CocoaPods私有庫

在操作之前,我們先看一下我們即將要改造的項目大致結(jié)構(gòu)


演示項目本身就是用CocoaPods管理的,因為我引用了一些第三方庫,下面我就要把紅框圈出來的公共模塊拿出來,放到私有pod里面,接下來我們按步驟一步一步來操作
首先要先區(qū)分倆概念:
Code Repository:比如我開發(fā)了一個功能模塊Tools,源碼文件是保存到Code Respository的,就是我們平時用的git倉庫。
Specs Repository:針對Tools會有一個Tools.podspec文件用來配置Tools的發(fā)布的,保存podspec文件的倉庫就是Specs Repository。它保存了所有要發(fā)布的組件的podspec文件,僅用來配置,叫配置倉庫。
總結(jié)一下,我們就需要創(chuàng)建兩個倉庫,一個方pod代碼,一個來放podspec配置

步驟 1:創(chuàng)建代碼倉庫Code Repository


登陸上gitlab,我們點擊新建項目,然后輸入項目名稱,勾選README,不勾選不會自動創(chuàng)建master分支,最后點create project創(chuàng)建項目
步驟 2:checkout Code Repository倉庫到本地~/swifttoolspod中,然后往該文件夾中添加如下內(nèi)容:
拉取代碼倉庫
注意??這里我使用的是ssh, 你要在gitlab上面配置你電腦的公鑰,具體怎么添加 百度:git ssh登陸

本地文件夾要添加的內(nèi)容

說明:
①其中Classes為文件夾,用來存儲組件的源碼,這里我示例項目Tools目錄下的文件拷貝了過來如圖。
②SwiftTools.podspect為當(dāng)前這個組件的pod描述我們可以通過

pod spec create SwiftTools

命令來生成.podspect模版文件
我們這里的文件內(nèi)容如下


Pod::Spec.new do |spec|
  spec.name         = "SwiftTools"
  spec.version      = "1.0.3"
  spec.summary      = "SwiftTools 項目常用的工具庫"
  spec.description  = <<-DESC
  swift 項目常用工具庫
                   DESC

  spec.homepage     = "http://lerpo.github.io"
  spec.license      = { :type => "MIT", :file => "LICENSE" }
  spec.author             = { "xml" => "" }
  spec.platform     = :ios
  spec.ios.deployment_target = "10.0"
  spec.source       = { :git => "http://127.0.0.1:8088/xml/tools.git", :tag => "#{spec.version}" }
  spec.source_files  = "Classes", "Classes/**/*.{swift}"
  spec.exclude_files = "Classes/Exclude"

  spec.dependency 'HandyJSON', '~> 5.0.1'
  spec.dependency 'SwiftyJSON'
  spec.dependency 'Alamofire', '~> 5.1'
  spec.dependency 'MJRefresh'
  spec.dependency 'MBProgressHUD', '~> 1.2.0'

end

3 LICENSE 文件,我們在代碼倉庫主頁,點擊添加許可證,然后選擇MIT,最后保存提交,LICENSE文件就生成了,最后我們把這個文件更新到本地倉庫



步驟 3:驗證SwiftTools.podspec,終端進(jìn)入到SwiftTools.podspec所在目錄執(zhí)行如下命令

pod lib lint --allow-warnings


如果出現(xiàn)SwiftTools passed validation,就代表驗證通過,如果出現(xiàn)[!] SwiftTools did not pass validation, due to 3 errors.,就代表沒通過驗證,你要根據(jù)錯誤?提示來修改,但所有驗證通過后,我們就可以進(jìn)行下一步了

步驟 4:將~/swifttoolspod內(nèi)添加的四樣內(nèi)容推送到gitlab上


我這是推送過的,如果是第一次也是一樣,代碼推送到倉庫里后,我們接下來要打標(biāo)簽tag
步驟 5:給代碼倉庫創(chuàng)建tag , tag名要和上面podspec文件中spec.version的值一致。

這種操作很簡單,就是給倉庫打tag,唯一要注意??的是tag名要和上面podspec文件中spec.version的值一致 OK代碼倉庫這邊我們已經(jīng)配置完了,接下來我們配置Specs Repository倉庫

步驟 6: 創(chuàng)建配置倉庫Specs Repository
跟創(chuàng)建代碼倉庫一樣,在gitlab上創(chuàng)建一個倉庫命名為Specs,這個倉庫用來保存.podspec文件??諅}庫需要創(chuàng)建一個README文件,因為gitlab在空倉庫中是沒有分支的,加個README讓其自動創(chuàng)建master分支


步驟 7: 配置倉庫checkout到本地~/podspec,注意??使用的是pod的命令,不是git clone

pod repo add SwiftTools http://127.0.0.1:8088/mengliang/Specs.git

步驟 8:將SwiftTools.podspec添加到配置倉庫
在代碼倉庫checkout的路徑~/podspec下面打開Terminal,執(zhí)行push命令

pod repo push Specs ../swifttoolspod/SwiftTools.podspec --allow-warnings

上面命令是將當(dāng)前目錄(/podspec)下的SwiftTools.podspec文件推送到/.cocoapods/repos目錄下SwiftTools文件夾對應(yīng)的遠(yuǎn)程倉庫中

就像下面出現(xiàn)綠色提示就代表推送成功

macbookdeMacBook-Pro:podspec mac$ pod repo push Specs ../swifttoolspod/SwiftTools.podspec --allow-warnings
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19/rbconfig.rb:229: warning: Insecure world writable dir /usr/local/sbin in PATH, mode 040777

Validating spec
 -> SwiftTools (1.0.3)
    - WARN  | description: The description is shorter than the summary.
    - WARN  | url: There was a problem validating the URL http://lerpo.github.io.
    - WARN  | [iOS] swift: The validator used Swift `4.0` by default because no Swift version was specified. To specify a Swift version during validation, add the `swift_versions` attribute in your podspec. Note that usage of a `.swift-version` file is now deprecated.
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'MJRefresh' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'SwiftyJSON' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'MBProgressHUD' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'HandyJSON' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'Alamofire' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'SwiftTools' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'Pods-App' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'App' from project 'App')
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating the `Specs' repo


Adding the spec to the `Specs' repo

 - [Fix] SwiftTools (1.0.3)

Pushing the `Specs' repo


[!] 'SwiftTools' uses the unencrypted 'http' protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts. Otherwise, please reach out to the library author to notify them of this security issue.

OK 萬事具備了,我們開始在項目中使用了

步驟 9:使用私有庫,項目配置profile文件


總共三步操作,仔細(xì)看我圖上的標(biāo)示,接下來更新庫
步驟 10:進(jìn)入到項目的根目錄執(zhí)行命令

pod install

更新完依賴庫,我們就可以運行項目了, 接下來我們看一下我們更新了私有庫我們該如何操作

四 更新私有庫

步驟 1 修改私有庫Code Repository源碼后,我們要修改.podspec描述文件,尤其要改版本號


步驟 2驗證文件有效性
在.podspec文件目錄下執(zhí)行 pod lib lint --allow-warnings命令

步驟 3驗證通過后推送到gitlab代碼倉庫
步驟 4給倉庫打個標(biāo)簽,注意??tag要跟.podspec描述文件里面的版本號一致
步驟 5 更新podspec Specs Repository倉庫,切換到本地Specs Repository倉庫執(zhí)行下面的命令

macbookdeMacBook-Pro:podspec mac$ pod repo push Specs ../swifttoolspod/SwiftTools.podspec --allow-warnings
macbookdeMacBook-Pro:podspec mac$ pod repo push Specs ../swifttoolspod/SwiftTools.podspec --allow-warnings
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin19/rbconfig.rb:229: warning: Insecure world writable dir /usr/local/sbin in PATH, mode 040777

Validating spec
 -> SwiftTools (1.0.3)
    - WARN  | description: The description is shorter than the summary.
    - WARN  | url: There was a problem validating the URL http://lerpo.github.io.
    - WARN  | [iOS] swift: The validator used Swift `4.0` by default because no Swift version was specified. To specify a Swift version during validation, add the `swift_versions` attribute in your podspec. Note that usage of a `.swift-version` file is now deprecated.
    - NOTE  | xcodebuild:  note: Using new build system
    - NOTE  | [iOS] xcodebuild:  note: Planning build
    - NOTE  | [iOS] xcodebuild:  note: Constructing build description
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'MJRefresh' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'SwiftyJSON' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'MBProgressHUD' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'HandyJSON' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'Alamofire' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'SwiftTools' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'Pods-App' from project 'Pods')
    - NOTE  | [iOS] xcodebuild:  note: Execution policy exception registration failed and was skipped: Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" (in target 'App' from project 'App')
    - NOTE  | [iOS] xcodebuild:  warning: Skipping code signing because the target does not have an Info.plist file and one is not being generated automatically. (in target 'App' from project 'App')

Updating the `Specs' repo


Adding the spec to the `Specs' repo

 - [Fix] SwiftTools (1.0.3)

Pushing the `Specs' repo


[!] 'SwiftTools' uses the unencrypted 'http' protocol to transfer the Pod. Please be sure you're in a safe network with only trusted hosts. Otherwise, please reach out to the library author to notify them of this security issue.

成功后進(jìn)入下一步操作
步驟 6 修改項目profile文件
步驟 7 在項目根目錄執(zhí)行

pod install

步驟 8 運行項目

總結(jié):如果項目再更新,那就循環(huán)往復(fù)這8個步驟,我們可以看到這些步驟很多很繁瑣,借助CI/CD這些都可以自動化操作(這個有時間再搞,大致就是docker部署jenkins,然后寫python腳本執(zhí)行上面的步驟操作,最后建個job構(gòu)建)

五 問題總結(jié)
1 pod代碼問題

我們從項目抽離出來的代碼放到私有pod倉庫,由于swift文件權(quán)限問題,并不能什么都不改就能直接引入到項目中使用. 我們需要修改文件權(quán)限. 這可是工作量很大的工作,做過你就知道了. 所以項目模塊化是很耗費精力的

遇到的權(quán)限問題,主要是你的方法要不要公開,允不允許別人重寫
open:公開的,內(nèi)部外部模塊都可訪問,這個開放性最大;public:也是公開的,但還是與open有所區(qū)別。
open與public區(qū)別:public在只能限制在定義所在模塊內(nèi)部進(jìn)行繼承與方法的重寫,而open則是只要模塊有被import,在可在此模塊中繼承或者重寫被import進(jìn)來的模塊中的類或方法。

2 項目引用問題

引入私有庫,在用法到私有庫的地方別忘了導(dǎo)入頭文件

最后我們再擴展一下,如果我有好多個公共庫我們該如何管理, 這些公共庫如果有項目依賴怎么辦??? 歡迎大家一起討論

最后的最后我把示例代碼貼出來:
項目代碼:https://github.com/lerpo/swiftproject/branches/all

抽離的pod庫代碼: xxxxx.github.com

項目運行起來的示例圖給大家來一張,都是美女噢??


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容