美文网首页
OCLint 安装使用

OCLint 安装使用

作者: 踩坑小分队 | 来源:发表于2020-07-02 15:34 被阅读0次

    简介

    OCLint 官方文档
    OCLint是一种静态代码分析工具,可以通过检查C,C ++和Objective-C代码并查找潜在问题来提高质量并减少缺陷。

    *   可能的错误-if / else / try / catch / finally语句为空
    *   未使用的代码-未使用的局部变量和参数
    *   复杂的代码-高循环复杂度,NPath复杂度和高NCSS
    *   冗余代码-冗余if语句和无用的括号
    *   代码气味-长方法和长参数列表
    *   错误做法-逻辑和参数的重新分配
    *   ...
    

    安装

    1、OCLint安装

    网上有好几种安装方式,但是都或多或少的会遇到些阻碍,这里直接把我本地安装好的上传到网上,大家直接按照步骤配置一下即可。
    https://github.com/yan998/OCLint0.15-BasicConfiguration
    OCLint 基础配置,当前配置的对应官方0.15版本

    1.1、第一步

    cd /usr/local/bin
    

    将下载项目的 bin 目录中的东西,拷贝到 /usr/local/bin 中


    image.png

    1.2、第二步

    cd /usr/local/lib
    

    将下载项目的 lib 目录中的东西<clang 和 oclint>,拷贝到 /usr/local/lib 中


    image.png

    1.3、重启终端,输入 oclint --version

      OCLint (http://oclint.org/):
      OCLint version 0.15.
      Built Feb 21 2020 (12:56:28).
    

    oclint安装成功

    2、 xcodebuild安装

    这个工具,安装Xcode之后就顺带安装了。。。

    3、 xcpretty安装

    在安装前,请确保机器已经安装Ruby gem。
    使用如下命令安装xcpretty:

    gem install xcpretty
    

    使用

    1、分析结果为Html报告

    1.1、将下面的脚本拷贝的项目中并修改

    #!/bin/bash
    # 指定编码
    export LANG="zh_CN.UTF-8"
    export LC_COLLATE="zh_CN.UTF-8"
    export LC_CTYPE="zh_CN.UTF-8"
    export LC_MESSAGES="zh_CN.UTF-8"
    export LC_MONETARY="zh_CN.UTF-8"
    export LC_NUMERIC="zh_CN.UTF-8"
    export LC_TIME="zh_CN.UTF-8"
    export LC_ALL=
    
    function checkDepend () {
    command -v xcpretty >/dev/null 2>&1 || {
    echo >&2 "I require xcpretty but it's not installed.  Install:gem install xcpretty";
    exit
    }
    command -v oclint-json-compilation-database >/dev/null 2>&1 || {
    echo >&2 "I require oclint-json-compilation-database but it's not installed.  Install:brew install oclint";
    exit
    }
    }
    
    function oclintForProject () {
    
    # 检测依赖
    checkDepend
    
    projectName=$1
    scheme=$2
    reportType=$3
    
    REPORT_PMD="pmd"
    REPORT_XCODE="xcode"
    
    myworkspace=${projectName}
    myscheme=${scheme}
    echo "myworkspace是:${myworkspace}"
    echo "myscheme是:${myscheme}"
    echo "reportType为:${reportType}"
    
    # 清除上次编译数据
    if [ -d ./build/derivedData ]; then
    echo '-----清除上次编译数据derivedData-----'
    rm -rf ./build/derivedData
    fi
    
    # xcodebuild -workspace $myworkspace -scheme $myscheme clean
    xcodebuild clean
    
    echo '-----开始编译-----'
    
    # 生成编译数据
    # 需要注意的是,有时候会使用xcodebuild -workspace name.xcworkspace clean命令,如果使用了clean命令,会清理编译缓存,本次操作需重新进行编译
    # 然后使用xcpretty将编译结果输出成后面需要的.json文件
    xcodebuild -workspace ${myworkspace} -scheme ${myscheme} -sdk iphonesimulator -derivedDataPath ./build/derivedData -configuration Debug COMPILER_INDEX_STORE_ENABLE=NO | xcpretty -r json-compilation-database -o compile_commands.json
    
    
    if [ -f ./compile_commands.json ]
    then
    echo '-----编译数据生成完毕-----'
    else
    echo "-----生成编译数据失败-----"
    return -1
    fi
    
    echo '-----分析中-----'
    
    # 自定义排除警告的目录,将目录字符串加到数组里面
    # 转化为:-e Debug.m -e Port.m -e Test
    exclude_files=("cardloan_js" "Pods")
    
    exclude=""
    for i in ${exclude_files[@]}; do
    exclude=${exclude}"-e "${i}" "
    done
    echo "排除目录:${exclude}"
    
    # 分析reportType =~判断子字符串包含关系
    if [[ ${reportType} =~ ${REPORT_PMD} ]]
    then
    nowReportType="-report-type html -o pmd.html"
    else
    nowReportType="-report-type xcode"
    fi
    # 自定义report 如:
    # nowReportType="-report-type html -o oclint_result.html"
    
    # 生成报表
    oclint-json-compilation-database ${exclude} -- \
    ${nowReportType} \
    -rc=LONG_CLASS=1500 \
    -rc=CYCLOMATIC_COMPLEXITY=10 \
    -rc=NESTED_BLOCK_DEPTH=10 \
    -rc=MAXIMUM_IF_LENGTH=10 \
    -rc=SHORT_VARIABLE_NAME=5 \
    -rc=MINIMUM_CASES_IN_SWITCH=10 \
    -rc=LONG_VARIABLE_NAME=20 \
    -rc=LONG_METHOD=200 \
    -rc=LONG_LINE=300 \
    -rc=NPATH_COMPLEXITY=200 \
    -rc=NCSS_METHOD=30 \
    -rc=TOO_MANY_FIELDS=20 \
    -rc=TOO_MANY_METHODS=30 \
    -rc=TOO_MANY_PARAMETERS=10 \
    -disable-rule ShortVariableName \
    -disable-rule ObjCAssignIvarOutsideAccessors \
    -disable-rule AssignIvarOutsideAccessors \
    -max-priority-1=100000 \
    -max-priority-2=100000 \
    -max-priority-3=100000
    
    rm compile_commands.json
    
    
    if [[ ${reportType} =~ ${REPORT_PMD} ]] && [ ! -f ./pmd.html ]
    then
    echo "${reportType}     ${REPORT_PMD}"
    echo "-----分析失败-----"
    return -1
    else
    echo '-----分析完毕-----'
    return 0
    fi
    }
    
    # 替换workspace的名字
    myworkspace="OCLintDemo001.xcworkspace"
    # 替换scheme的名字
    myscheme="OCLintDemo001"
    # 输出方式 xcode/pmd
    reportType="pmd"
    
    oclintForProject ${myworkspace} ${myscheme} ${reportType}
    

    1.2、将sh文件放在和xxx.xcodeproj,同级目录下

    image.png

    1.3、运行脚本开始检测
    OCLintDemo001.xcworkspace的名称
    OCLintDemo001scheme
    pmd是结果输出方式,最终以网页的形式输出

    sh oclint.sh 
    

    1.4、检测结果查看
    检测完毕之后会生成 pmd.html ,检测的相关问题会整理在其中

    image.png
    检测结果.png
    可以根据后面相关的警告,查询具体的代码位置
    比如:
    image.png
    Person.m 的 80行 56个字符处
    unused method parameter
    - (void)MyFunc:(NSString *)name age:(int)Age location:(NSString *)location {
        
        NSLog(@"123");
    }
    

    OCLint说我们的location参数没有用到。
    相关的警告也可以去官网查询
    ps:查询的时候,把报错的原因中的空格删掉
    unused method parameter ---->> unusedmethodparameter

    image.png
    就能查询到相关的解释了
    image.png

    文档中会有相关的错误示例,可以对比自己的项目代码,怎么修改。
    如果英文版本的看着不爽,也可以看热心网友翻译版本
    https://blog.csdn.net/foolsong/article/details/77414695
    https://www.jianshu.com/p/35cf99c07eaa

    当然了,检测出的问题不一定就是问题,要根据自己的实际情况进行修改。

    2、将分析结果直接以⚠️的形式展示在Xcode中

    2.1、创建Aggregate

    image.png
    2.2、创建script
    image.png
    并在里面直接运行我们的 sh oclint.sh 脚本
    image.png
    2.3、修改脚本的最终展现形式
    把脚本的
    # 输出方式 xcode/pmd
    reportType="pmd"
    

    修改为

    # 输出方式 xcode/pmd
    reportType="xcode"
    

    2.4、项目运行切换到 OCLint target,然后编译
    这种方式更加直观

    image.png

    规则参数设置

    移步到脚本规则部分,根据自己需求修改,修改完毕将影响到上面两种检测结果

    # --命名
    # 变量名字最长字节
    #-rc=LONG_VARIABLE_NAME=20 \
    # 变量名字最短字节
    #-disable-rule ShortVariableName \
    # --size
    # 圈复杂度
    #-re=CYCLOMATIC_COMPLEXITY=10 \
    # 每个类最行数
    #-rc=LONG_CLASS=700 \
    # 每行字节数量
    #-rc=LONG_LINE=200 \
    # 每个方法行数
    #-rc=LONG_METHOD=80 \
    # 忽略注释后括号后的有效代码行数
    #-rc=NCSS_METHOD=40 \
    # 嵌套深度
    #-rc=NESTED_BLOCK_DEPTH=5 \
    # 字段数量
    #-rc=TOO_MANY_FIELDS=20 \
    # 方法数量
    #-rc=TOO_MANY_METHODS=30 \
    # 方法参数
    #-rc=TOO_MANY_PARAMETERS=6
    

    相关文章

      网友评论

          本文标题:OCLint 安装使用

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