項目中CocoaPods獨立模塊自動化更新(基于git)

目前項目模塊化工作已經完成,整個項目分為四大業務模塊和一個底層,然后每個業務模塊都指向公司內網的git私有庫,平常開發小組都會注釋掉其他模塊,縮減編譯時間。現在問題來了,一旦需要更新其他模塊的代碼時,pod install也不會即使更新。

先來介紹pod引用私有庫的兩種方式:

  1. 引用.git庫
pod 'BFRefreshHeader', :git => 'http://.../ios_components/BFRefreshHeader.git', :tag => '1.0' 


此處引用公司內網的.git地址,pod install會出現在Pods項目下的Pods文件下,所有的庫文件在一個group下無序的顯示,沒有開發時的group層級關系,不適合開發,適合不需要經常改動的組件庫。需要在執行pod install更新代碼時必須指向新的tag。

  1. 引用本地庫
pod 'BFRefreshHeader', :path => '../../BFRefreshHeader'

此處需先將1中的.git地址clone到本地,然后將path(注意:1中是git)指向本地路徑,pod install會出現在Pods項目下的Development Pods文件下,所有的庫文件按正常的層級group顯示,適合開發,適合經常改動的組件庫。更新代碼需要在模塊項目中執行git pull,然后在主項目中執行pod install。

綜上所訴,當需要跨模塊聯調時,需要更新對方模塊代碼,不可能讓對方打一個tag給你更新。所以我們采用第二種方式引用。將四個模塊全部clone到本地,然后只在聯調的時候我們才引入主項目。

以上介紹完畢,開始本文需要解決的問題,上文提到第二種引用方式更新所有代碼的流程:四個模塊執行git pull——>更新Podfile為本地路徑引用——>主項目pod install——>重新打開主項目(因為pod install后pod項目會打不開,需重新打開主項目,未知原因)

所以現在問題又來了,如此更新一次代碼未免太過復雜繁瑣,然而計算機最擅長做的不就是重復又繁瑣的事情嗎,所以現在寫一個腳本來實現上訴流程。

  • 更新的主要代碼:
# profile文件目錄
ROOT_PATH = os.getcwd()

# 業務模塊名
MODULES_NAMES = ['ModuleA', 'ModuleB', 'ModuleC', 'ModuleD', 'Core']
# 本地路徑名
MODULES_PATHS = ['../../ModuleA', '../../ModuleB', '../../ModuleC', '../../ModuleD', '../../Core']
# 項目遠程地址
MODULES_URLS = ['http://.../ModuleA.git', 'http://.../ModuleB.git', 'http://.../ModuleC.git', 'http://.../ModuleD.git', 'http://.../Core.git']
# 最新的分支(與模塊名列表對應)
MODULES_BRANCHS = ['release1.0', 'release1.0', 'release1.0', 'release1.0', 'release1.0']

def update_project():

    # 關閉Xcode
    os.system("killall Xcode")

    # 批量更新業務模塊
    for path in MODULES_PATHS:
        index = MODULES_PATHS.index(path)
        sub_moudle_dir = os.path.join(ROOT_PATH, path)
        if os.path.exists(sub_moudle_dir):
            print "start update >> %s" % MODULES_NAMES[index]
            os.system("cd %s;git -C %s pull" % (ROOT_PATH, path))
        else:
            print "start clone >> %s" % MODULES_NAMES[index]
            os.system("cd %s;git clone %s %s;cd %s;git checkout -b %s origin/%s" % (ROOT_PATH, MODULES_URLS[index], path, path, MODULES_BRANCHS[index], MODULES_BRANCHS[index]))

    print "start update >> 主項目"
    # 更新主目錄(注意:無主項目修改權限者禁止提交,所以會先重置主項目修改,否則主項目有修改請先提交,不然后果自負)
    os.system("cd %s;git reset --hard;git clean -d -fx"";git pull;git status" % ROOT_PATH)

    # 更新podfile,替換為本地路徑
    update_podfile()

    # pod install
    os.system("cd %s;pod install" % ROOT_PATH)

    # 打開Xcode,(Xcode與應用里當前xcode名相同)
    os.system("cd %s;open -a Xcode example.xcworkspace/" % ROOT_PATH)
  • 更新Podfile文件
# 更新Podfile文件
def update_podfile():
    podfile_path = ROOT_PATH + "/Podfile"

    fo = open(podfile_path,'r+')
    content = fo.read()
    for eachline in open(podfile_path,'r+'):
        pattern = re.compile(r'\'(\w+)\', :(\w+) => (.+)')
        match = pattern.search(eachline)
        if match:
            module_name = match.group(1)
            if module_name in MODULES_NAMES:
                index = MODULES_NAMES.index(module_name);
                type_name = match.group(2)
                if not (type_name == 'path'):
                    eachline_new = "  pod '%s', :path => '%s'\n" % (module_name, MODULES_PATHS[index])
                    content = content.replace(eachline, eachline_new)

    # 清空原字文件,寫入替換后的內容
    fo = open(podfile_path, 'w')
    fo.write(content)
    fo.flush()

此處可能有人任然用第一種.git的方式引用,或者第二種方式引用的路徑不同,所以此處要替換成自己本地clone的子模塊路徑。

學習python不久,發現python的正則運用實在是太強大了,忍不住要寫腳本的沖動。每天上班打開電腦第一件事就是執行一遍腳本,然后優雅的端起茶杯的感覺太愜意了????。上面有不對的地方或可以優化的地方還望大家幫我指出,十分感謝!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 項目組件化、平臺化是技術公司的共同目標,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 22,189評論 0 39
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,104評論 25 708
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby,可以先安裝xcode,再安裝macport ,最后...
    山天大畜閱讀 1,886評論 0 1
  • 學習新知識必然是一個踩坑的過程,這兩天看了下pod私有庫的創建,總體來說還是比較簡單的,但是中間踩了一個坑,也不能...
    Yasin的簡書閱讀 1,861評論 4 11
  • 最近在復習JS基礎,對于JS中的面向對象寫法在此總結一下。 第一種:TS寫法(ES6寫法) 這種寫法是在做項目里經...
    云峰yf閱讀 1,139評論 0 5