OCLint CodeReview静态代码分析

前言

OCLint 是一个静态分析代码的工具,支持自定义规则,可以很好地帮助我们规范代码,提高代码质量,是团队开发CodeReview一大利器,本文主要通过OCLint让XCode来Code Review,网上的资料挺多的,(但还是有些坑)记录下方便自己以后越坑.
OCLint相关的详细内容也可以到OCLint官网上查看。

安装OCLint 和 xcpretty

  1. 安装xcpretty
    用gem安装xcpretty
    sudo gem install xcpretty
    用sudo是防止一些权限出现问题

安装OCLint

1)通过安装包:
从oclint的github项目链接下载安装
OCLINT_HOME=/pathexport PATH=$PATH:OCLINT_HOME/bin
然后source .bashrc即可

2)通过Homebrew
brew tap oclint/formulae
brew install oclint

3)确认安装成功
运行oclint确认环境配置正确
$ oclint
如果展示以下内容即为安装成功:
oclint: Not enough positional command line arguments specified!Must specify at least 1 positional arguments: See: oclint -help

4)oclint的版本
oclint --version
which oclint oclint存放位置

OCLint 三个指令

1)oclint常规核心指令
oclint [options] <source> -- [compiler flags]
[options]为一些参数选项,可以是规则加载选项、报告形式选项等:

  1. -R <路径> : 检测所用的规则的路径,默认路径$(/path/to/bin/oclint)/../lib/oclint/rules
  2. -disable-rule <规则名>: 让相对应的规则失效(OCLint 规则列表)。
  3. -rc <参数>=<值> :修改阈值
  4. -report-type <报告类型>,有"text"、“html”、“json”、“pmd”、“xcode”几个类型
  5. -o <路径> 报告生成路径.
    eg oclint -R /path/to/rules -disable-rule ObjCAssignIvarOutsideAccessors -report-type xcode

2)oclint-json-compilation-database
从编译好的compile_commands.json 文件中读取配置信息并执行 oclint。
主要用于生成compile_commands.json文件,现在已经不进行维护了,我们可以用xcpretty替代,来生成json文件.
oclint-json-compilation-database 指令
这是我们主要用到的指令,它是oclint 指令的升级版,使用起来相对 oclint 指令简单方便。可以通过 -- 的方式在指令的最后加上oclint 选项。
oclint-json-compilation-database 指令有过滤文件选项
-i :包含进某些文件
oclint-json-compilation-database -i Pods
-e : 过滤掉某些文件
oclint-json-compilation-database -e Pods

3)oclint-xcodebuild 指令
oclint-xcodebuild 指令不再维护,实际应用中用xcpretty代替.

OCLint使用

1)新建工程AddTest添加Aggregate

075F858D-C8F3-4B97-BF59-FC8C8DA95925.png

2)选择Aggregate

2ACF7D44-CF28-4F6D-BDD2-86416762945D.png

3)点击next输入ProductName

图片.png

4)建立运行脚本

C480D7AC-D0E5-48BB-BB1B-790EC8E3C670.png

5)配置运行脚本

CA419EC0-8487-4F3D-9102-3674258695EC.png

6)运行结果

87EE9D72-60DB-4A33-B39E-02067599AA53.png

***注意点 ***

1.在根目录下新建文件oclint,然后进入oclint文件夹,touch oclint.sh
2.sh脚本不对,路径不对都很容易gg,有些运行成功但是不报警告,需要检查下路径.
3 oclint.sh脚本

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 ${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 pmd -o pmd.xml"
    else    
        nowReportType="-report-type xcode"
    fi
    # 自定义report 如:
    # nowReportType="-report-type html -o oclint_result.html"

    # 生成报表
    oclint-json-compilation-database ${exclude} -- \
    ${nowReportType} \
    -rc LONG_LINE=200 \
    # --命名
    # 变量名字最长字节
    -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=50 \
    # 方法参数 #
    -rc=TOO_MANY_PARAMETERS=6
    -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.xml ]
    then
        echo "-----分析失败-----"
        return -1
    else
        echo '-----分析完毕-----'
        return 0
    fi
}

# 替换workspace的名字
myworkspace="AddTest.xcworkspace"
# 替换scheme的名字
myscheme="AddTest"
# 输出方式 xcode/pmd
reportType="xcode"

oclintForProject ${myworkspace} ${myscheme} ${reportType}

下面是几个参考链接,我获益良多,建议深入阅读,尤其是里面的例子…

http://oriochan.com/codeReview01.html
http://www.cocoachina.com/ios/20170928/20669.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容

  • 写在前面 刚入职的时候,博哥交代给我一个任务,让我调研一款叫SonarQube的静态代码分析工具,我当时跪在了Ce...
    雨润听潮阅读 2,240评论 0 5
  • 文章结构: 1. 什么是 OCLint 2. OCLint 安装2.1. Homebrew 安装2.2. 下载并设...
    Muzzzzzy阅读 9,917评论 3 21
  • 为什么要使用 OCLint 做为一个静态代码分析工具,我们引入 OCLint 的目的主要是为了提高我们的代码质量。...
    分贝丶阅读 1,677评论 0 1
  • OCLint OCLint 是基于 Clang 的静态分析工具,支持对 C、C++ 和 Objective-C 代...
    Demonboy阅读 3,550评论 0 1
  • 文:沐儿 不顺心的时候,好像一切都跟你较着劲儿,倒霉事一桩接着一桩。Wendy刚刚被老板辞退,车子坏了,电脑总是死...
    沐儿阅读 3,605评论 40 60