PY脚本打包AS多个工程

2017-02-20  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读