博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用python的mod_pbxproj 自动化 修改Xcode 工程
阅读量:2346 次
发布时间:2019-05-10

本文共 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/

你可能感兴趣的文章
SweetAlert插件
查看>>
JSON学习
查看>>
有关项目的基础知识
查看>>
创建Java工程实现发送邮件(163邮箱)
查看>>
java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger javax/mail/MessagingException
查看>>
JavaScript学习
查看>>
JavaScript学习总结
查看>>
JQuery学习总结笔记1
查看>>
JQuery学习笔记2
查看>>
代码质量及其优化(学习笔记)
查看>>
将代码托管到GitHub
查看>>
Java实现PDF的生成(使用IText)
查看>>
MySQL学习笔记
查看>>
数据库连接池
查看>>
MySQL性能优化经验
查看>>
MySQL学习参考
查看>>
Java工程结构管理(BuildPath/系统库/外部库)
查看>>
将代码托管到Coding
查看>>
JS-异步提交表单的几种方式
查看>>
获取windows系统错误
查看>>