美文网首页
PY脚本打包AS多个工程

PY脚本打包AS多个工程

作者: 代码没写完休想上厕所 | 来源:发表于2017-02-20 15:52 被阅读11次

    build_quanjiatong.py

    #!/usr/bin/env python
    # coding:utf-8
    
    '''
    Created on Feb 16, 2017
    
    @author: xwang
    
    Ai学全家桶打包
    '''
    
    import os
    import helper
    import shutil
    
    rootDir = '..'
    configFile = 'quanjiatong.prop'
    returnDir = ''
    purge_log = 0
    versionCode = "1000000"
    versionName = "1.0.0"
    minifyEnabled = "false"
    
    
    def getFileList(dir, fileList):
        newDir = dir
        if os.path.isfile(dir):
            fileList.append(dir.decode('gbk'))
        elif os.path.isdir(dir):
            for s in os.listdir(dir):
                # 如果需要忽略某些文件夹,使用以下代码
                # if s == "xxx":
                # continue
                newDir = os.path.join(dir, s)
                getFileList(newDir, fileList)
        return fileList
    
    def updateVersion():
        print("start updateVersion")
        with open("app/build.gradle", "r") as f:
            lines = f.readlines()
    
        spaceSplitedProps = ('versionCode',
                             'versionName',
                             'minifyEnabled')
    
        i = 0
        versionCodeChanged = False
        versionNameChanged = False
    
        for line in lines:
    
            line = line.strip()
            if (len(line) == 0):
                i = i + 1
                continue;
    
            for propName in spaceSplitedProps:
                if propName in line:
                    if (propName == 'versionCode' and versionCodeChanged == False):
                        lines[i] = '        versionCode ' + versionCode + '\n'
                        print("lines[i]--》 " + lines[i])
                        versionCodeChanged = True
                    if (propName == 'versionName' and versionNameChanged == False):
                        lines[i] = '        versionName ' + versionName + '\n'
                        print("lines[i]--》 " + lines[i])
                        versionNameChanged = True
                    if (propName == 'minifyEnabled'):
                        lines[i] = '            minifyEnabled ' + minifyEnabled + '\n'
                        print("lines[i]--》 " + lines[i])
    
            i = i + 1
        fl=open('app/build.gradle', 'w')
        for ii in lines:
            fl.write(ii)
        fl.close()
        return
    
    
    def buildApk(project):
        os.chdir(returnDir)
        print os.getcwd()
        # exit(0)
        os.chdir('../../../' + project)
        print("curProPath --> " + os.getcwd())
    
        updateVersion()
        # exit(0)
    
        buildApkPath = os.getcwd()
        print os.getcwd()
    
        apkSourceDir = buildApkPath + '/app/build/outputs/apk'
        print(os.path.exists(apkSourceDir))
        if os.path.exists(apkSourceDir):
            print ("delete origin apk folder...")
            shutil.rmtree(apkSourceDir)
    
        tmpRootDir = os.path.abspath(rootDir)
        dstDir = tmpRootDir + '/shared-library/comm/aixuebuild'
    
        print ("purge_log --> " + purge_log)
        if purge_log == '1':
            print ("purge log...")
            helper.watchExecuteCommand(dstDir + '/purge_log.py ' + project)
        helper.watchExecuteCommand('./gradlew assembleRelease')
    
        print("tmpRootDir : " + tmpRootDir)
    
        if not os.path.exists(dstDir):
            helper.watchExecuteCommand('mkdir -p', dstDir)
    
        print("buildApkPath : " + buildApkPath)
    
        print("apkSourceDir : " + apkSourceDir)
    
        apkSourceName = getFileList(apkSourceDir, [])
        print("apkSourceName : " + apkSourceName[0])
    
        cmd = 'cp ' + apkSourceName[0] + ' ' + dstDir
        print('copy cmd --> ' + cmd)
        helper.watchExecuteCommand(cmd, cmdAlias='copy plugin to: ' + dstDir)
        if purge_log == '1':
            helper.watchExecuteCommand('git reset --hard')
    
    
    if __name__ == '__main__':
        configs = helper.readPropertyFile(configFile)
        quanjiatongs = configs['quanjiatongs']
        qianjiatongArray = quanjiatongs.split(',')
        qianjiatongArray = map(lambda x: x.strip(), qianjiatongArray)
    
        returnDir = os.getcwd()
    
        purge_log = configs['purge_log']
        versionCode = configs['versionCode']
        versionName = configs['versionName']
        minifyEnabled = configs['minifyEnabled']
    
        for e in qianjiatongArray:
            print e
            buildApk(e);
    
            # exit(0);
    
    
    

    helper.py

    '''
    Created on Mar 7, 2016
    
    @author: lqp
    '''
    
    import os
    import re
    import sys
    import subprocess as subproc
    
    projectRoot = ''
    
    logFile = None
    
    
    def buildLog(msg):
        if logFile:
            logFile.write(msg + '\n')
    
        print(msg)
    
    
    # tool module code start
    def watchExecuteCommand(cmd, args='', cmdAlias=None):
        if not cmdAlias:
            cmdAlias = cmd
        else:
            cmdAlias = '[' + cmdAlias + ']'
    
        buildLog('Cmd: ' + cmdAlias + " " + args)
    
        code = subproc.Popen(cmd + " " + args, shell=True).wait()
        if code:
            print 'Fail: ' + str(code)
            exit()
        else:
            print 'Success !!!'
    
    
    def collectFilesByPattern(folder, include=None, exclude=None):
        if not os.path.isdir(folder):
            buildLog('collectFilesByPattern: folder not exist: ' + folder)
            return []
    
        srcFiles = []
    
        fileList = os.listdir(folder)
        for i in fileList:
            i = folder + '/' + i
            if os.path.isdir(i):
                srcFiles += collectFilesByPattern(i, include, exclude)
            else:
                if include and not re.match(include, i):
                    continue
    
                if exclude and re.match(exclude, i):
                    continue
    
                srcFiles.append(i)
    
        return srcFiles
    
    
    def strUntil(string, endChar):
        res = ''
    
        for c in string:
            if c == endChar:
                break;
    
            res += c
    
        return res
    
    
    def error(string):
        sys.exit("Error: " + string)
        return
    
    
    def stripQuotedString(string):
        res = string
    
        if (string.startswith('\'') and string.endswith('\'')) \
                or (string.startswith('"') and string.endswith('"')):
            res = string[1:-1]
    
        return res
    
    
    def stripProjectString(string):
        res = string
    
        if (string.startswith('\'') and string.endswith('\'')) \
                or (string.startswith('"') and string.endswith('"')):
            res = string[1:-1]
    
        if res.startswith(":"):
            res = res[1:]
    
        return res
    
    
    def expandJarPath(libString, pathPrefix=None):
        pathList = []
    
        splitItems = libString.split(',')
        for item in splitItems:
            if 'dir' in item:
                dirItem = item.split(':')[1].strip()
                dirItem = stripQuotedString(dirItem)
            elif 'include' in item:
                pass
    
        libDir = dirItem
        if pathPrefix:
            libDir = projectRoot + '/' + pathPrefix + '/' + libDir
        else:
            libDir = os.getcwd() + '/' + libDir
    
        if not os.path.exists(libDir):
            # print("libPath: " + libDir + " not exist")
            return
    
        libFiles = os.listdir(libDir)
        for libFile in libFiles:
            if libFile.endswith('.jar'):
                pathList.append(libDir + '/' + libFile)
    
        return pathList
    
    
    def deDuplicateStringList(srcList):
        if len(srcList) == 0:
            return srcList
    
        item = srcList.pop()
        dstList = []
    
        while item:
    
            if item not in dstList:
                dstList.append(item);
    
            if len(srcList) > 0:
                item = srcList.pop()
            else:
                item = None
    
        srcList += dstList
        return
    
    
    def readPropertyFile(path):
        dicts = {}
    
        lines = []
        with open(path) as fd:
            for line in fd.readlines():
                if re.match(r'^\s*#', line) or '=' not in line:
                    continue
                else:
                    # print('append property line:' + line)
                    if line.endswith('\n'):
                        line = line[:len(line) - 1]
                        
                    lines.append(line)
    
        for line in lines:
            items = line.split('=')
    
            dicts[items[0].strip()] = items[1].strip()
    
        return dicts
    
        # tool module code end
    
    

    purge_log.py

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    '''
    Created on Mar 5, 2015
    
    @author: lqp
    '''
    
    import os
    import re
    import helper
    
    import os.path as pathUtil
    
    bbLogRegPattern = re.compile(r'(^\s*)(BBLog\.[^;]+;)', re.DOTALL | re.MULTILINE);
    normalLogRegPattern = re.compile(r'(^\s*)(Log\.[^;]+;)', re.DOTALL | re.MULTILINE);
    
    workDir = '../';
    srcFolder = ['app/src/main/java'
                  ];
    processCount = 0
    
    
    def listFiles(path, outList):
        files = os.listdir(path);
    
        for item in files:
            item = path + pathUtil.sep + item;
    
            if pathUtil.isdir(item):
                listFiles(item, outList);
            else:
                if pathUtil.splitext(item)[1] == '.java':
                    outList.append(item)
    
        return
    
    
    def processFile(fileName):
        srcFile = open(fileName, "r");
        content = srcFile.read()
        srcFile.close()
    
        global workDir
        needWrite = 0
    
        # replace BBlog
        groups = bbLogRegPattern.findall(content);
        if len(groups) > 0:
            global processCount
    
            print 'purge BBLog in: ' + pathUtil.relpath(fileName, workDir);
    
            content = re.sub(bbLogRegPattern, r'\1//BBLog call replaced', content);
    
            needWrite = 1
    
        ##replace Log.x()
        groups = normalLogRegPattern.findall(content);
        if len(groups) > 0:
            global processCount
    
            print 'purge Log.x in: ' + pathUtil.relpath(fileName, workDir);
    
            content = re.sub(normalLogRegPattern, r'\1//Log.x call replaced', content);
    
            needWrite = 1
    
        if needWrite:
            srcFile = open(fileName, "w");
            srcFile.write(content)
            srcFile.close()
            processCount = processCount + 1
    
        return
    
    
    if __name__ == '__main__':
        if len(os.sys.argv) < 2:
            helper.error('Usage: ' + os.sys.argv[0] + ' projectName')
    
        projectName = os.sys.argv[1]
        print("projectName --> " + projectName)
    
        holderList = []
    
        workDir = pathUtil.abspath(workDir) + "/" + projectName
    
        print 'start work at dir: ' + workDir
    
        for folder in srcFolder:
            listFiles(workDir + os.path.sep + folder, holderList);
        #listFiles(workDir, holderList);
    
    for item in holderList:
        print("item --> " + item)
        processFile(item)
    
    print 'process complete: ' + str(processCount) + ' files changed'
    pass
    
    

    相关文章

      网友评论

          本文标题:PY脚本打包AS多个工程

          本文链接:https://www.haomeiwen.com/subject/xwrewttx.html