美文网首页
日常开发中的脚本

日常开发中的脚本

作者: Arnold134777 | 来源:发表于2016-05-06 18:44 被阅读51次

    日常开发中写的脚本

    一直想抽时间学习一下shell编程,一直给自己找借口,万事开头难写的第一个日常工作用到的脚本。

    1.杀掉端口的所有进程

    #!/bin/sh
    if [ $# -lt 1 ]; then
        echo "need 1 argument!"
        exit 0
    fi
    for info in "$(sudo lsof -i tcp:$1)"
    do
        index=0
        for element in ${info}   
        do  
            let index=index+1
            if [ $index -eq 11 ]; then
                echo "$(sudo kill -9 $element)"
                break
            fi
        done 
    done
    

    使用例子:

    ./kill_port.sh 8081
    

    2.合并当前目录下模拟器,真机的静态库

    #!/bin/sh
    if [ $# -lt 3 ]; then
        echo "need 3 arguments!"
        exit 0
    fi
    
    lipo -create $1 $2 -output $3
    lipo -info $3
    

    使用

    ./lib_merge.sh xxx1.a xxx2.a xxx.a
    

    3.扫描图片size大于限制size的图片

    #!/bin/sh
    if [ $# -lt 1 ]; then
        echo "请输入限制图片大小"
        exit 0
    fi
    
    find . -type f -size +$1k -name *.png > result.txt
    open ./result.txt
    

    使用 限制size 70k

    ./filter_large_size_images.sh 70
    

    4.扫描项目中未使用的图片资源(支持RN)

    # -*- coding: utf-8 *-
    
    import os
    import os.path
    import copy
    import datetime
    import time
    import sys
    import ConfigParser
    
    import re
    
    def cur_file_dir():
         #获取脚本路径
         path = sys.path[0]
         #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
         if os.path.isdir(path):
             return path
         elif os.path.isfile(path):
             return os.path.dirname(path)
    
    
    def get_file_lists(rootdir, resource_pattern, applyFliter):   # 获取文件列表
        file_lists = []
        sum = 0
        for parent,dirnames,filenames in os.walk(rootdir):    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
    
            for filename in filenames:                        #输出文件信息
                fullpath = os.path.join(parent,filename)
                if (applyFliter):
                    if ('.framework' in fullpath) or ('react_native' in fullpath) or ('Pods' in fullpath):
                        continue
                ext = filename.split('.')[-1]
    
                filename = filename.split('.')[0]
                if '@' in filename:
                    filename = filename.split('@')[0]
    
                if ' '+ ext +' ' in resource_pattern:
                    file_lists.append([filename, fullpath, 0]) # 0 用于标记资源是否被使用的状态,后面会使用
    
        return file_lists
    
    
    
    
    def process_resources(resource_lists): # 去除第三方库的资源
    
        new_resource_lists = []
    
        for resource_list in resource_lists:
            path = resource_list[1]
            #print path
            if (not '.framework' in path) and (not 'react_native' in path) and (not 'Pods' in path):
                #print path
                new_resource_lists.append(resource_list)
    
        return new_resource_lists
    
    def rn_process_resource(rn_resource_lists): # 去除RN中的基础库
    
        rn_new_resource_lists = []
        for rn_resource_list in rn_resource_lists:
            path = rn_resource_list[1]
            if (not 'node_modules' in path):
                rn_new_resource_lists.append(rn_resource_list)
    
        return rn_new_resource_lists
    
    def get_unused_resources(resource_lists, code_lists):   #检查未使用的资源
    
        unused_resource_lists = []
    
        for code_list in code_lists:
            filePath = code_list[1]
            if os.path.exists(filePath) == False:
                continue;
            fileObj = open(filePath, 'r')  
            lines = fileObj.read()
            
            for index, resource_list in enumerate(resource_lists):
                resource = resource_list[0]
                if resource in lines:
                    resource_lists[index] = [resource_list[0], resource_lists[1], 1]
    
            fileObj.close()
    
    
        for resource_list in resource_lists:
            if resource_list[2] == 0:
                unused_resource_lists.append(resource_list)
    
        return unused_resource_lists
    
    
    
    
    def check_package_info(resource_lists, proj_file, pod_file): #检查资源是否被打包
        
        unused_resource_list = []
    
        fileObj1 = open(proj_file, 'r')  
        lines1 = fileObj1.read()
        fileObj2 = open(pod_file, 'r')  
        lines2 = fileObj2.read()
    
        for resource_list in resource_lists:
    
            resource = resource_list[0]
    
            if  resource in lines1 or resource in lines2:
                #print resource
                unused_resource_list.append(resource_list)
            # else:
            #     print '%s is not packaged' % resource
        
        return unused_resource_list
    
    
    
    def Print_to_file(file_lists,LogFile):    # 打印到日志文件
        print LogFile
        fileObj = open(LogFile, 'w') 
        print >> fileObj, "The unused resource lists: " 
    
        for file_list in file_lists:
            print >> fileObj, file_list[1]
        
        fileObj.close()
    
    
    if __name__=="__main__":
    
        currenttime=datetime.datetime.now().strftime('%Y-%m-%d_%H.%M.%S')
        LogPath=cur_file_dir()+'/Logs/UnusedResources-' + currenttime
    
        if not os.path.exists(LogPath):
            os.makedirs(LogPath)
        UnusedResource_Log=LogPath+"/native_ununsed.txt"
        RN_UnusedResource_Log=LogPath+"/rn_unused.txt"
    
        
    
        match_resource_pattern=' png jpg ' #前后必须有一个空格  待检查的资源文件类型
        match_code_pattern=' h m xib mm plist ' #前后必须有一个空格 
        rn_match_code_pattern=' js '
    
    
        #### 设置参量
        ProjPath=cur_file_dir()
        ProjectName='XX' # 自己定定义projectName
        xcodeprojPath=cur_file_dir()+'/' + ProjectName + '/' + ProjectName + '.xcodeproj/project.pbxproj'
        PodsprojPath=cur_file_dir()+'/' + ProjectName + '/Pods/Pods.xcodeproj/project.pbxproj'
        RNPath=cur_file_dir()+'/react_native'
    
        # 获得资源文件列表
        print '获得Native资源文件列表...'
        resource_lists = get_file_lists(ProjPath, match_resource_pattern,True)
        resource_lists = process_resources(resource_lists)
    
        # 获得代码文件列表
        print '获得Native代码文件列表...'
        code_lists = get_file_lists(ProjPath,match_code_pattern,True)
    
        # 检查资源是否被工程所使用
        print '检查Native资源是否被工程所使用...'
        unused_resource_list = get_unused_resources(resource_lists, code_lists)
    
        # 检查未被使用的资源是否被打包
        print '检查Native未被使用的资源是否被打包...'
        unused_package_resource_list = check_package_info(unused_resource_list, xcodeprojPath, PodsprojPath)
    
        # 打印到日志
        print '打印Native未被使用的资源到日志...'
        Print_to_file(unused_package_resource_list, UnusedResource_Log)
    
        ######################################### RN ############################################
        # 获取RN资源文件列表
        print '获得RN资源文件列表...'
        rn_resource_lists = get_file_lists(RNPath, match_resource_pattern,False)
        rn_resource_lists = rn_process_resource(rn_resource_lists)
    
        # 获取RN代码文件列表
        print '获得RN代码文件列表...'
        rn_code_lists = get_file_lists(RNPath,rn_match_code_pattern,False)
    
        #检查RN资源是否被工程所使用
        print '检查RN资源是否被工程所使用...'
        rn_unused_resource_list = get_unused_resources(rn_resource_lists, rn_code_lists)
    
        # 打印到日志
        print '打印RN未被使用的资源到日志...'
        Print_to_file(rn_unused_resource_list, RN_UnusedResource_Log)
    
    • 1.ProjectName='XXX' 指定项目名
    • 2.cd 到项目根目录下执行python check_all_rn_interfaces.py即可,结果在根目录Logs文件中。

    5.扫描项目中所有的RN Module以及接口属性

    # -*- coding: utf-8 *-
    
    import os
    import os.path
    import copy
    import datetime
    import time
    import sys
    import ConfigParser
    
    import re
    
    def cur_file_dir():
         #获取脚本路径
         path = sys.path[0]
         #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
         if os.path.isdir(path):
             return path
         elif os.path.isfile(path):
             return os.path.dirname(path)
    
    
    def get_file_lists(rootdir, resource_pattern):   # 获取文件列表
        file_lists = []
        for parent,dirnames,filenames in os.walk(rootdir):    #三个参数:分别返回1.父目录 2.所有文件夹名字(不含路径) 3.所有文件名字
    
            for filename in filenames:                        #输出文件信息
                fullpath = os.path.join(parent,filename)
                if ('react-native' in fullpath) or ('Pods' in fullpath) or ('Example' in fullpath):
                    continue
                ext = filename.split('.')[-1]
    
                filename = filename.split('.')[0]
                if '@' in filename:
                    filename = filename.split('@')[0]
    
                if ' '+ ext +' ' in resource_pattern:
                    file_lists.append([filename, fullpath, 0]) # 0 用于标记资源是否被使用的状态,后面会使用
    
        return file_lists
    
    
    def check_package_info(resource_lists, proj_file, pod_file): #检查资源是否被打包
        
        used_resource_list = []
    
        fileObj1 = open(proj_file, 'r')  
        lines1 = fileObj1.read()
        fileObj2 = open(pod_file, 'r')  
        lines2 = fileObj2.read()
    
        for resource_list in resource_lists:
            resource = resource_list[0]
            if  resource in lines1 or resource in lines2:
                used_resource_list.append(resource_list)
        
        return used_resource_list
    
    def filter_all_include_rn_interface_list(resource_lists, include_module_keyWords,include_interface_keyWords,export_interface_keyWords):
        all_include_rn_interface_list = []
    
        for resource_list in resource_lists:
    
            fullpath = resource_list[1]
            fileObj = open(fullpath, 'r')
            lines = fileObj.read()
    
            for module_keyword in include_module_keyWords:
                if module_keyword in lines: ### module存在
                    insert_file = []
                    insert_file.append(fullpath)
    
                    find_current_index = 0
                    while find_current_index < len(lines):
                        find_item_start = -1
                        find_item_keyWord = ''
                        for interface_keyWord in include_interface_keyWords:
                            temp_find_item_start = lines.find(interface_keyWord,find_current_index)
                            if temp_find_item_start != -1: ### 找到关键字的起始位置
                                if find_item_start == -1:
                                    find_item_start = temp_find_item_start
                                    find_item_keyWord = interface_keyWord
                                elif temp_find_item_start < find_item_start:
                                    find_item_start = temp_find_item_start
                                    find_item_keyWord = interface_keyWord
    
                        if find_item_start == -1: ### 如果找不到直接退出
                            break;
    
                        if find_item_keyWord in export_interface_keyWords:
                            find_item_end = lines.find(')',find_item_start + 1) ### 部分关键字的调用没有'{}'
                            find_item_end = find_item_end + 1;
                        else:
                            find_item_end = lines.find('{',find_item_start + 1)
                            find_item_end = find_item_end - 1
    
                        if find_item_end != -1:
                            insert_string = lines[find_item_start:find_item_end - 1]
                            
                            if '@' not in insert_string:
                                insert_file.append('           ' + lines[find_item_start:find_item_end])
                           
                        find_current_index = find_item_end + 1  
    
                    all_include_rn_interface_list.append(insert_file)  
                    break
    
        return all_include_rn_interface_list 
            
    def Print_to_file(file_lists,LogFile):    # 打印到日志文件
        print LogFile
        fileObj = open(LogFile, 'w') 
        print >> fileObj, "result lists: " 
    
        for file_list in file_lists:
            for item in file_list:
                print >> fileObj, item
            print  >> fileObj,'\n'
            print  >> fileObj,'\n' 
        
        fileObj.close()
    
    
    
    
    if __name__=="__main__":
    
        currenttime=datetime.datetime.now().strftime('%Y-%m-%d_%H.%M.%S')
        LogPath=cur_file_dir()+'/all_used_rn_interfaces_' + currenttime
        ProjectName='XXX' # 自己定定义projectName
    
        if not os.path.exists(LogPath):
            os.makedirs(LogPath)
        resultPath=LogPath+"/result.txt"
    
        match_code_pattern=' m mm ' #前后必须有一个空格 
        filter_module_keyWords = ['RCT_EXPORT_MODULE']
        filter_interface_keyWords = ['RCT_CUSTOM_VIEW_PROPERTY','RCT_EXPORT_METHOD','RCT_EXPORT_VIEW_PROPERTY','RCT_REMAP_VIEW_PROPERTY']
        filter_export_interface_keyWords = ['RCT_EXPORT_VIEW_PROPERTY','RCT_REMAP_VIEW_PROPERTY']
    
        #### 设置参量
        ProjPath=cur_file_dir()
        xcodeprojPath=cur_file_dir()+'/' + ProjectName + '/' + ProjectName +'.xcodeproj/project.pbxproj'
        PodsprojPath=cur_file_dir()+'/' + ProjectName + '/Pods/Pods.xcodeproj/project.pbxproj'
    
         # 获得代码文件列表
        print '获得Native代码文件列表...'
        code_lists = get_file_lists(ProjPath,match_code_pattern)
    
        # 过滤掉项目中未使用的类
        print '过滤掉项目中未使用的类...'
        code_lists = check_package_info(code_lists, xcodeprojPath, PodsprojPath)
    
        # 过滤含有RN接口或属性的类
        print '过滤含有RN接口或属性的类...'
        code_lists = filter_all_include_rn_interface_list(code_lists, filter_module_keyWords,filter_interface_keyWords,filter_export_interface_keyWords)
    
    
        Print_to_file(code_lists, resultPath)
       
    

    使用:

    • 1.ProjectName='XXX' 指定项目名
    • 2.cd 到项目根目录下执行python unused_resource_check.py即可,结果在根目录all_used_rn_interfaces开头的文件中。

    相关文章

      网友评论

          本文标题:日常开发中的脚本

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