目前項目模塊化工作已經完成,整個項目分為四大業務模塊和一個底層,然后每個業務模塊都指向公司內網的git私有庫,平常開發小組都會注釋掉其他模塊,縮減編譯時間。現在問題來了,一旦需要更新其他模塊的代碼時,pod install也不會即使更新。
先來介紹pod引用私有庫的兩種方式:
- 引用.git庫
pod 'BFRefreshHeader', :git => 'http://.../ios_components/BFRefreshHeader.git', :tag => '1.0'
此處引用公司內網的.git地址,pod install會出現在Pods項目下的Pods文件下,所有的庫文件在一個group下無序的顯示,沒有開發時的group層級關系,不適合開發,適合不需要經常改動的組件庫。需要在執行pod install更新代碼時必須指向新的tag。
- 引用本地庫
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的正則運用實在是太強大了,忍不住要寫腳本的沖動。每天上班打開電腦第一件事就是執行一遍腳本,然后優雅的端起茶杯的感覺太愜意了????。上面有不對的地方或可以優化的地方還望大家幫我指出,十分感謝!!!