显示导航

365bet地区使用CodeNarc在365bet地区应用中进行静态代码分析

在本指南中,您将学习如何使用CodeNarc通过静态分析来改进代码

伊万·洛佩斯(IvánLópez)

365bet地区版本 4.0.1

365bet地区培训

365bet地区培训由创建并积极维护365bet地区框架的人们开发和交付

入门

当我们编写代码时,遵循一些规则,正确地遵循样式规则等很重要,但是有时并不是那么简单。当我们在每个成员都有自己偏好的团队中工作时,这一点就显得尤为重要。代码分析工具

在本指南中,您将要安装和配置Codenarc365bet地区为了帮助您提高365bet地区代码的质量,您还将学习如何创建自定义CodeNarc规则CodeNarc分析Groovy代码并报告潜在的错误和代码问题

您将需要什么

要完成本指南,您将需要以下内容

  • 花些时间在你手上

  • 体面的文本编辑器或IDE

  • 安装了JDK或更高版本JAVA首页适当配置

如何完成指南

要开始,请执行以下操作

要么

365bet地区指南存储库包含两个文件夹

  • 初始初始项目通常是一个简单的365bet地区应用程序,其中包含一些其他代码,可以帮助您快速入门

  • 完成一个完整的示例它是按照指南中介绍的步骤进行操作并将这些更改应用于文档的结果。初始

要完成指南,请转到初始

  • 光盘进入grails指南grails codenarc初始

您可以直接前往如果你光盘进入grails指南grails codenarc完成

编写申请

多项目构建

365bet地区我们将使用365bet地区应用程序和自定义CodeNarc规则设置一个多项目构建,如下图所示。

多项目

检查我们的365bet地区365bet地区多项目构建指南以了解更多

规则类型

当前的CodeNarc版本包括规则分为类别

  • 基本的例如检查是否没有空其他要么最后

  • 大括号您看过多少次如果要么其他仅带有一个不带花括号的语句我个人不喜欢不带花括号的代码,因为它将来会成为错误的来源。我们可以在此类别中添加规则以执行这些检查

  • 惯例当我们写一个倒写的书时,有一些规则要检查一些约定如果一个如果可以转换为猫王操作员

  • 例外情况例如,如果我们抛出一个空指针异常.

365bet地区而且还有更多类别可以检查是否有重复的导入未使用的变量,如果没有的话,当然还有365bet地区规则的特定类别

将CodeNarc添加到我们的项目

将CodeNarc添加到我们的项目是一个简单的任务,因为Gradle插件去做吧

让我们修改建立gradle并添加以下内容

应用程序构建gradle
应用: "${rootProject projectDir}gradle Codenarc Gradle的"

我们将所有CodeNarc配置封装在gradle Codenarc Gradle的:

gradle Codenarc Gradle的
应用插入: 'Codenarc' (1)codenarc工具版本'1.4' (2)configFile文件"${rootProject projectDir}配置Codenarc规则") (3)reportFormat'html' (4)忽略失败真正 (5)
}
1 应用Codenarc插入
2 设置我们要使用的CodeNarc版本
3 使用规则定义主文件默认情况下,CodeNarc使用配置codenarc codenarc xml但是我们不想写XML文件吗
4 我们想要的报告格式对于人类可读的格式,我们使用html如果我们想将CodeNarc与Jenkins集成在一起,则需要将其更改为XML文件.
5 我们不希望只有一次违反时构建会失败

然后我们需要创建规则文件

配置Codenarc规则
规则集描述'365bet地区365bet地区 CodeNarc项目规则集'规则集'规则集基本xml'规则集'规则集大括号xml'规则集'规则集约定xml'规则集'规则集设计xml'规则集'规则集干燥xml'规则集'规则集异常xml'规则集'规则集格式xml'规则集'规则集通用XML'规则集'规则集导入xml'规则集'规则集命名xml'规则集'规则集不必要的xml'规则集'规则集未使用的xml'规则集'规则集grails xml')
}

使用此配置,我们可以运行校验任务

gradlew app check check截至日期完整codenarc主要发现违反CodeNarc的行为,请参阅文件主页上的报告。 DATE完成过程资源到最新日期完成类到最新日期完成compileTestJava否源完成compileTestGroovy否源完成过程TestResources否来源完整测试类到最新日期完成测试否源完成检查总时间秒

我们可以打开测试报告以检查违规情况

报告
  • 首先,我们有一个包含执行日期和使用的CodeNarc版本的部分

  • 然后是带有摘要的另一部分,其中包含违规文件的总数以及具有优先级和

  • 之后,每个文件都有一个小节,在其中,我们可以看到文件中的所有违规内容,包括代码行和一小段代码。规则名称是指向更详细说明的链接

让我们修复违规

有多种解决CodeNarc违规的方法

  • 解决问题顾名思义,只是解决违规问题

  • 禁用规则有时我们不同意特定的CodeNarc违规行为我们可以将其禁用

  • 忽略特定类或方法的规则这种情况是当我们不想禁用该规则而只想在特定类或方法中跳过它时

解决问题

  • 解决违规问题FileEndsWithoutNewline在末尾添加新行网址映射文件

  • 解决违规问题SpaceBeforeOpeningBrace在大括号之前添加一个空格

禁用规则

对于类JavadocNoDef我们可以禁用修改常规规则文件

应用程式src Codenarc规则设定
规则集描述'365bet地区 CodeNarc项目规则集'规则集'规则集约定xml') {
        'NoDef'已启用规则集'规则集格式xml') {
        '类Javadoc'已启用
        }
    }
    ...
}

忽略规则

最后,我们可以忽略特定类的规则,在这种情况下,我们将忽略不必要的GStringUrlMappings常规使用禁止警告:

应用程序grails应用程序控制器演示UrlMappings groovy
禁止警告(['不必要的GString'])
 网址映射 {

    静态的映射"/$控制者/$行动?/$ID?(.$格式)?"约束在此处应用约束
            }
        }

        "/"(视图:"指数")
        "500"(视图:'错误')
        "404"(视图:'未找到')
    }
}

检查结果

只需再次执行校验任务,然后打开报告以查看所有违规行为均已消失

报告

最终配置

如果您将CodeNarc安装在一个中型项目中,而在您有数百个或数千个违规事件之前未使用任何静态分析工具,则可能是您的团队在编写代码时不够谨慎,而且CodeNarc默认配置很可能包含一些您不同意的规则,这些规则可能不适合团队

我的建议是查看所有违规行为,阅读其文档,然后决定是否要禁用它们,并配置其他选项,最后修复并尊重它们

为此,只需编辑建立gradle文件

应用程序构建gradle
Codenarc我们需要删除以下行
    ignoreFailures是059
}

使用此配置,一旦达到这些阈值,构建将失败

编写自定义规则

365bet地区有时特定于365bet地区,我们可能想创建自己的规则


grails gorm Transactions事务性代替.
365bet地区交易性365bet地区注释更好,因为它不会创建运行时代理,它是AST转换,它在编译时应用,因此没有运行时开销。365bet地区注释还提供了其他功能,而Spring则没有

grails gorm Transactions事务性交易事务.

建立规则

创建项目

Codenarc规则构建gradle
'时髦''' (1)测试编译'junit junit'
}
1

365bet地区为了能够在我们的365bet地区应用程序中使用此新CodeNarc规则,我们需要确保jar文件在创建过程中的类路径中可用codenarcMain税款

gradle Codenarc Gradle的
'' (1)类型为CodeNarc的任务(2)"${rootProject projectDir}Codenarc规则构建库Codenarc规则罐")
}
1
2

定义规则

第一步是使用有关我们要创建的规则的信息创建一个元信息文件

<> xmlns="http codenarc org规则集"
        =""
        ="http codenarc org规则集http codenarc org规则集模式xsd"
        xsi noNamespaceSchemaLocation="">
    365bet地区 (1)
    <> ='365bet地区'/> (2)
1 规则组的描述
2

其次,我们用纯文本和html创建一个带有规则说明的属性文件。消息将在html报告中使用

365bet地区365bet地区Transactional description检查是否使用org springframework交易注释Transactional代替org springframework交易注释Transactional 365bet地区Transactional description html检查grails gorm Transactions事务性用于代替org springframework交易注释Transactional.

实施规则

365bet地区
组织codenarc规则grails进口 常规转换CompileStatic
进口 
进口 
进口 org codehaus groovy ast ImportNode
进口 组织Code groovy ast ModuleNode
进口 
进口 org codenarc规则AbstractAstVisitorRule

静态编译
 365bet地区365bet地区TransactionalRule (1)
    2 (2)
    '365bet地区交易' (3)
    365bet地区(4)
}

静态编译
 365bet地区365bet地区TransactionalVisitor AbstractAstVisitor(5)

    私人的 静态的 最后 'org springframework交易注释Transactional'
    私人的 静态的 最后 错误味精'不要使用Spring Transactional使用grails gorm Transactions'

    
    虚空(6)由于Vie的是做我们站在青睐小号覆写
    虚空visitImports ModuleNode节点(7)节点导入每个ImportNode importNodeimportClass importNode className如果(8)
1 AbstractAstVisitorRule
2
3
4 实施规则的类
5 访客班级需要从AbstractAstVisitor
6 检查类和方法的注释,以防Spring用于添加新的违规
7 检查该类的导入,是否为Spring导入后添加新的违规
8

当然,我们需要编写测试以确保一切正常

365bet地区
进口 org codenarc规则AbstractRuleTestCase
 组织代码规则
 组织违反Codenarc规则
 

 365bet地区 延伸(1)

    
    规则createRule(2)
         365bet地区
    虚空365bet地区test365bet地区TransactionalIsAllowedOnClassWithImport最后''' (3)'''assertNoViolations来源(4)
    }

    测试
    虚空365bet地区最后'''grails gorm Transactions事务类TestService'''assertNoViolations来源测试
    虚空365bet地区test365bet地区TransactionalIsAllowedOnMethodWithImport最后'''导入grails gorm事务事务类TestService Transactional void foo'''assertNoViolations来源测试
    虚空365bet地区最后''''''assertNoViolations来源测试
    虚空最后''''''

        (5)assertSingleViolation SOURCE违反违规规则优先级2'365bet地区交易'
        }
    }

    测试
    虚空testSpringTransactionalIsNotAllowedOnClassWithFullpackageAnnotation最后''''''2'365bet地区365bet地区交易'
        }
    }

    
    虚空最后'''导入组织springframework事务注释事务类TestService事务无效foo'''assertSingleViolation SOURCE违反违规规则优先级2违反规则名称'365bet地区365bet地区交易'
        }
    }

    测试
    虚空testSpringTransactionalIsNotAllowedOnMethodWithFullpackageAnnotation最后'''class TestService org springframework交易注释Transactional void foo'''assertSingleViolation SOURCE违反违规规则优先级2违反规则名称'365bet地区交易'
        }
    }
}
1 AbstractRuleTestCase
2
3
4 365bet地区在这种情况下,我们使用365bet地区交易性
5 当我们使用Spring时交易性我们希望有一次违规

365bet地区

365bet地区一旦创建了规则并将其在类路径上可用,就可以将其添加到365bet地区应用程序中了

应用程式src Codenarc规则设定
'365bet地区365bet地区 CodeNarc项目规则集'规则集'')
}

在上面

 org springframework交易注释Transactional

 演示服务 {

    
    虚空myMethod println'一些业务逻辑'
    }
}

最后一步是生成CodeNarc报告

报告

如我们所见,我们有一个新的违规,因为我们创建的规则已被应用

365bet地区

365bet地区:

免费咨询

365bet地区OCI 365bet地区团队365bet地区包括365bet地区联合创始人检查我们的365bet地区365bet地区并向发展和维护365bet地区的工程师学习

365bet地区Grails OCI团队