本文共 16756 字,大约阅读时间需要 55 分钟。
目前就先贴代码,等我这边项目做完,然后详细的写一篇这个方面的技术博客
建议结合这一篇博客来看# coding=utf-8from mod_pbxproj import XcodeProjectimport osfrom foundation import *from mod_pbxproj import *import plistlibfrom pbxproj.pbxextensions import FileOptions# 修改工程def changXcodeProject(): print("开始修改工程配置") # load projectPath = '/Users/systudiosy/Desktop/TestModFy/TestModFy.xcodeproj/project.pbxproj'# 打开项目 project = XcodeProject.load(projectPath)#添加framework搜寻目录 project.add_framework_search_paths(paths="/Users/systudiosy/Desktop/frameworks")# 添加libraey搜寻目录 project.add_library_search_paths(paths="/Users/systudiosy/Desktop/frameworks")# 添加头文件 project.add_header_search_paths("/Users/systudiosy/Desktop/frameworks")# 添加文件夹 project.add_folder("My")# 项目添加文件# project.add_file("/Users/systudiosy/Desktop/frameworks/SySDKLib.framework",force=False) project.remove_framework_search_paths("/Users/systudiosy/Desktop/frameworks/SySDKLib.framework") project.remove_library_search_paths(paths="/Users/systudiosy/Desktop/frameworks")# 添加other link flag project.add_other_ldflags('-ObjC') project.add_other_ldflags('-all_load')#移除链接标识 # project.remove_other_ldflags('-all_load')# 备份 backname = project.backup() print(backname) # save project.save(projectPath) # project.get_or_create_group(projectPath,parent=)# 修改plist 文件def changPlist(): workPath = "/Users/systudiosy/Desktop/frameworks/" # os.chdir(workPath) print("work:" +os.getcwd()) plistPath = os.path.join(workPath,"Info.plist") # plistPath = "Info.plist" if os.path.isfile(plistPath): print("路径存在") print(plistPath) # try: # plist = plistlib.load(plistPath) # except (Exception ): # print("Something bad happened:") with open(plistPath, 'rb') as fp: plist = plistlib.load(fp,fmt=None,use_builtin_types=True,dict_type=dict) plist['NSMotionUsageDescription'] = "使用传感器" plist['HelloMM'] = "hehhehehhehehehheheheeh" print(plist) print(type(plist)) with open(plistPath,'wb') as fp: # sort_keys 是否排序 plistlib.dump(value=plist,fp=fp, fmt=plistlib.FMT_XML, sort_keys=True, skipkeys=False) print(plist) # 加载/打开 # --------------------------------------------- # 更新plist # --------------------------------------------- # plistlib.dump(plist,plistPath) # plist['CFBundleDevelopmentRegion'] = 'chinese' # plist.writeToFile_atomically_(path, 1)# 开始打包def callXcodeArchive(): # profile = PROVISION_CER[bundleIdIndex][1] # sign = PROVISION_CER[bundleIdIndex][2] # # cmd = "xcodeBuild clean build -project " + appName + "Build/Unity-iPhone.xcodeproj" + " PROVISIONING_PROFILE=\"" + profile + "\" CODE_SIGN_IDENTITY=\"" + sign + "\" " + "ENABLE_BITCODE=NO" # # if buildMode == "debug" or buildMode == "release": # cmd = cmd + " -configuration Debug" # else: # cmd = cmd + " -configuration Release" # # print # cmd # # if os.system(cmd) != 0: # exit(10) # # os.chdir(path) passdef testAddFile(): projectPath = "/Users/systudiosy/Desktop/TestModFy/TestModFy.xcodeproj/project.pbxproj" project = XcodeProject.load(projectPath) file_options = FileOptions(weak=True) filePath = "/Users/systudiosy/Desktop/EZW_SDKs/EZW_pay_sdk/EzwSDK.framework" target_name = "TestModFy" project.add_file(path=filePath,parent=None,tree=None,target_name=target_name,force=False,file_options=file_options) project.remove_files_by_path(filePath) project.backup() project.save(projectPath)if __name__ == '__main__': # testAddFile() # changXcodeProject() changPlist() # open project projectPath = '/Users/systudiosy/Desktop/TestModFy/TestModFy.xcodeproj/project.pbxproj' absProjectPath = os.path.abspath(projectPath) # project = XcodeProject.load(absProjectPath) # project.add_file("/Users/systudiosy/Desktop/Quick1/1.png") # new_group = project.get_or_create_group('myGroup') # project.add_file("/Users/systudiosy/Desktop/Quick1/1.png",parent=new_group) # project.add_file("/Users/systudiosy/Desktop/frameworks/SySDKLib.framework",tree="SDKROOT")# project.add_file('usr/lib/libz.dylib', tree='SDKROOT') project.backup() # project.add_framework_search_paths("",recursive=False) # project.save("/Users/systudiosy/Desktop/frameworks") # IMPORTANT, DONT USE THE OLD VERSION!
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Author: fasthro# @Date: 2016-11-15 11:21:33# @Last Modified by: fasthro# @Last Modified time: 2016-11-15 11:21:57import shutilimport osimport jsonimport reimport platform# from mod_pbxproj.mod_pbxproj import XcodeProjectfrom pbxproj import *import plistlibimport shutil# 修改工程from pbxproj.pbxextensions import FileOptions, TreeType_channel = "TT"_bundleId = "com.ebo.ball"_version = "1.0.0"# # 设置编码# import sys## reload(sys)# sys.setdefaultencoding("utf-8")# 解析class ParseChannelParam: def __init__(self, jp): self.json_data = None self.json_file_data = None self.json_resource_data = None self.json_base_framework_data = None self.json_other_framework_data = None self.bundle_id = None self.version = None # 文件列表 self.file_list = [] # xcode 文件目录 self.file_path_list = [] # 文件类型 self.file_type_list = [] # xcode 文件列表 self.xcode_file_list = [] # 文件夹列表 self.folder_list = [] # xcode 文件夹目录 self.folder_path_list = [] # 目录类型 self.folder_type_list = [] # xcode 文件夹列表 self.xcode_folder_list = [] # framework self.base_frameworks = [] self.base_weak_frameworks = [] self.other_frameworks = [] self.other_weak_frameworks = [] # 解析 self.parse(jp) # 写入文件列表 self.writfilelist() # 写入文件夹列表 self.writfolderlist() # 写入other self.writeother() def parse(self, jp): try: print(jp) with open(jp) as jf: self.json_data = json.load(jf) print(self.json_data) self.json_file_data = self.json_data["file"] self.json_resource_data = self.json_data["resource"] self.json_base_framework_data = self.json_data["base_framework"] self.json_other_framework_data = self.json_data["other_framework"] except: print("parse json error") pass def writfilelist(self): if self.json_file_data is not None: l = len(self.json_file_data) if l > 0: for index in range(0, l): self.file_list.append(self.json_file_data[index]["file_name"]) self.file_path_list.append(self.json_file_data[index]["file_path"]) self.file_type_list.append(self.json_file_data[index]["type"]) for index in range(len(self.file_path_list)): if self.file_type_list[index] == 'copy': self.xcode_file_list.append(os.path.join(self.file_path_list[index], self.file_list[index])) def writfolderlist(self): if self.json_resource_data is not None: l = len(self.json_resource_data) if l > 0: for index in range(0, l): self.folder_list.append(self.json_resource_data[index]["dir_name"]) self.folder_path_list.append(self.json_resource_data[index]["dir_path"]) self.folder_type_list.append(self.json_resource_data[index]["type"]) for index in range(len(self.folder_path_list)): if self.folder_type_list[index] == 'copy': self.xcode_folder_list.append(os.path.join(self.folder_path_list[index], self.folder_list[index])) def writeother(self): print(self.json_data) self.bundle_id = self.json_data["bundleId"] self.version = self.json_data["version"] if self.json_base_framework_data is not None: for index in range(len(self.json_base_framework_data)): self.base_frameworks.append(self.json_base_framework_data[index]["path"]) self.base_weak_frameworks.append(self.json_base_framework_data[index]["weak"]) if self.json_other_framework_data is not None: for index in range(len(self.json_other_framework_data)): self.other_frameworks.append(self.json_other_framework_data[index]["path"]) self.other_weak_frameworks.append(self.json_other_framework_data[index]["weak"]) def __str__(self): return "ParseChannelParam :\nbundle_id = %s version = %s \nxcode_file_list = %s \nxcode_folder_list = %s\n\n" % ( self.bundle_id, self.version, str(self.xcode_file_list), str(self.xcode_folder_list))# 打包之前准备工作class PreparatoryWork: def __init__(self, frompath, topath, filefromls, filetols, folderfromls, foldertols): # from 根目录 # /Users/systudiosy/Desktop/TestAllChannls/TT self.from_path = frompath # /Users/systudiosy/Desktop/TestTargetsFoMy/ # to 根目录 self.to_path = topath # 需要 copy 的文件 self.file_from_path_list = filefromls self.file_to_path_list = filetols # 需要 copy 的目录 self.folder_from_list = folderfromls print("folder_from_list:===>") print(folderfromls) print("\n") self.folder_to_path_list = foldertols print("foldertols:===>") print(foldertols) print("\n") # copy self.copy(filefromls, filetols) self.copy(folderfromls, foldertols) def copy(self, fs, ts): for index in range(len(fs)): frompath = os.path.join(self.from_path, fs[index]) topath_temp = os.path.join(self.to_path, ts[index]) topath = os.path.join(topath_temp, fs[index]) # 如果已经存在就删除 if os.path.exists(topath): if os.path.isdir(topath): shutil.rmtree(topath) else: os.remove(topath) if os.path.isfile(frompath): print("copy %s -> %s" % (frompath, topath)) shutil.copy(frompath, topath) else: print("copy %s -> %s" % (frompath, topath)) shutil.copytree(frompath, topath)# Xcode *.pbxproj 相关设置class Xcode: """ ·xpath : xcode 根目录 ·folders : 需要添加的文件夹列表 ·files : 需要添加的文件列表 """ def __init__(self, xpath=None, folders=[], files=[]): # xcode project path self.xcode_project_path = xpath # xcode pbxproj path if platform.system() == "Windows": self.xcode_pbxproj_path = os.path.join(xpath, 'TestTargetsFoMy-TT.xcodeproj/project.pbxproj.xml') else: self.xcode_pbxproj_path = os.path.join(xpath, 'TestTargetsFoMy-TT.xcodeproj/project.pbxproj') print("XcodeProjectPath=%s"%(self.xcode_pbxproj_path)) # need add folders self.folders = folders # need add files self.files = files self.project = None if self.xcode_pbxproj_path is not None: pstr_xml = self.xcode_pbxproj_path[len(self.xcode_pbxproj_path) - 4: len(self.xcode_pbxproj_path)] pstr_proj = self.xcode_pbxproj_path[len(self.xcode_pbxproj_path) - 8: len(self.xcode_pbxproj_path)] if pstr_xml == '.xml': self.project = XcodeProject.LoadFromXML(self.xcode_pbxproj_path) elif pstr_proj == '.pbxproj': self.project = XcodeProject.load(self.xcode_pbxproj_path) else: print("xcode load error path = [%s]" % self.xcode_pbxproj_path) if self.project is None: print("Xcode load error") else: pass # temp file list self.temp_files = None self.temp_folder = None def addfileToXcode(self): self.addfiles(self.files) def addfolderToXcode(self): self.addfolders(self.folders) # 导入文件设置 -fno-objc-arc def set_file_seting(self, f_path, flag): if self.project: f_id = self.project.get_file_id_by_path(f_path) files = self.project.get_build_files(f_id) for f in files: f.add_compiler_flag(flag) # 添加文件夹 def addfolders(self, folders): if self.project: self.temp_files = [] for dpp in folders: dp = os.path.join(self.xcode_project_path, dpp) if os.path.exists(dp): print "add folder to xcode path = [%s]" % dp self.project.add_folder(dp) # add folder file to xcode self.getfilesdir(dp) else: print("add folder path = [%s] is not exist!" % dp) print("add folder file : ") if len(self.temp_files) > 0: self.addfiles(self.temp_files) def getfilesdir(self, dp): for f in os.listdir(dp): f_p = os.path.join(dp, f) if os.path.isfile(f_p): self.temp_files.append(f_p) else: cp = re.compile(r".bundle|.framework") gp = cp.search(f_p) if gp is not None: self.temp_files.append(f_p) else: self.getfilesdir(f_p) def addfiles(self, files): if self.project: for fpp in files: fp = os.path.join(self.xcode_project_path, fpp) if os.path.exists(fp): print("add file to xcode path = [%s]" % fp) self.project.add_file_if_doesnt_exist(fp) else: print("add file path = [%s] is not exist!" % fp) for fp in files: comp = re.compile('.m$|.mm$') match = comp.search(fp) if match: print("file [ *.m or *.mm ] seting flag set -fno-objc-arc path [ %s ]" % fp) self.set_file_seting(fp, '-fno-objc-arc') def addframework(self, frameworks=[], weaks=[], isbase=True): if self.project: framework_parent = self.project.get_or_create_group('Frameworks') for index in range(len(frameworks)): fw = frameworks[index] we = weaks[index] comp = re.compile('.framework$') match = comp.search(fw) tree = None sr = "other" if isbase == True: tree = "SDKROOT" sr = "base" weak = we == "True" if match: print( "add %s framework [ %s ] weak = %s" % (sr, fw, we)) self.project.add_file_if_doesnt_exist(fw, parent=framework_parent, weak=weak, tree=tree) else: print( "add %s libraries [ %s ]" % (sr, fw)) self.project.add_file_if_doesnt_exist(fw, parent=framework_parent, weak=False, tree=tree) def save(self, fp=None): if self.project: if fp is not None: self.project.save(fp) else: self.project.save() print( "save project")if __name__ == "__main__": # path # _path = os.getcwd() # 项目路径(需要配置的路径) # /Users/systudiosy/Desktop/TestTargetsFoMy/TestTargetsFoMy-1.xcodeproj _path = "/Users/systudiosy/Desktop/TestAllChannls" # /TT if platform.system() == "Windows": _path = "D:/work/ballClient/trunk" # 其他路径 # /Users/systudiosy/Desktop/TestAllChannls/TT _channel_path = "%s/%s" % (_path, _channel) _channel_param_path = "%s/%s_channal.json" % (_channel_path, _channel) # /Users/systudiosy/Desktop/TestTargetsFoMy/TestTargetsFoMy.xcodeproj _xcode_path = "/Users/systudiosy/Desktop/TestTargetsFoMy/" # 解析配置文件 parseJson = ParseChannelParam(_channel_param_path) print(parseJson) print("Preparatory Work : ") # 根据配置拷贝和替换文件 preparat = PreparatoryWork(_channel_path, _xcode_path, parseJson.file_list, parseJson.file_path_list, parseJson.folder_list, parseJson.folder_path_list) # 根据配置文件设置xcode xcode = Xcode(_xcode_path, parseJson.xcode_folder_list, parseJson.xcode_file_list) print("\nadd file to xcode : ") xcode.addfileToXcode() print("\nadd folder to xcode : ") xcode.addfolderToXcode() print("\nadd system framework to xcode : ") print(parseJson.base_frameworks) xcode.addframework(parseJson.base_frameworks, parseJson.base_weak_frameworks, True) xcode.addframework(parseJson.other_frameworks, parseJson.other_weak_frameworks, False) if platform.system() == "Windows": xcode.save("project.pbxproj") else: xcode.save()
喜欢博主的土豪朋友们扫描屏幕下方二维码金额随意,感谢大家支持,增加写作动力
转载地址:http://zenvb.baihongyu.com/