Qodana
The code quality platform for teams
Qodana 2023.1:灵活的配置文件配置,支持迁移到 Kotlin/JS IR 编译器,检查 Go 的许可兼容性,插件集成,以及 30 多项新检查
Qodana 是 JetBrains 开发的智能代码质量平台,目前处于预览阶段。 这款强大的静态分析引擎可以将检查从 JetBrains IDE 带到任何 CI 管道,在 CI 服务器上运行资源密集型检查,为您节省时间和计算资源。 支持 60 多种技术,分析无限行数的代码。
新版 Qodana 拥有重要的增强功能,可以帮助您确保代码具有最高质量。 2023.1 版让 CI 管道的静态分析步骤拥有更大的灵活性。 我们引入了一种针对项目扫描配置检查的智能方式,并实现了可能是向 Qodana 静态分析引擎添加插件的最简单方式。
请继续查看重大更新的完整列表,或直接跳到 linter 特定的增强功能。

重大更新
使用新的 YAML 格式实现灵活的配置文件配置
检查配置文件是 Qodana 配置的关键部分。 它们定义了在运行分析时 Qodana 将对代码应用的一组检查。
从 2023.1 版开始,Qodana 以人类可读的 YAML 格式提供了灵活的配置文件配置功能,这使您可以更轻松地自定义检查配置文件,并随着项目的进展进行调整。 下面是用于优化分析的选项:
- [新] 将检查分组并管理此类群组。
- [新] 包括现有配置文件和创建新配置文件。
- 启用和禁用检查。
- 设置检查参数。
- 配置检查范围。
例如,在使用 PHP/常规检查类别检查代码时,可以从 Qodana For PHP linter 中排除 PhpDeprecationInspection
检查。
name: "PHP/General without PhpDeprecationInspection" inspections: - group: "category:PHP/General" enabled: true # Enable the 'PHP/General' category - inspection: PhpDeprecationInspection enabled: false # Disable the PhpDeprecationInspection inspection
请参阅此文档,详细了解自定义配置文件。
默认配置文件的重大重构
Qodana 提供两种类型的默认配置文件 – qodana.starter,它仅用于重要检查,是项目初始扫描的理想选择,以及 qodana.recommended,它会启用一组广泛适用于大多数项目的预先选择的检查。
我们重写了这两个配置文件,使它们与 IDE 中提供的默认配置文件保持一致。 这一变化可以让您获得更高的透明度,使您能够确保 Qodana 和您的 IDE 运行的检查基本相同,从而有助于对代码质量采用更一致的方式。
您可以在 GitHub 中找到更新的 qodana.recommended 配置文件。 此配置文件与默认的 IDE 配置文件相匹配,但有几项例外:
- 对于更轻量级的分析,所有全局检查都会被禁用,因为它们可能非常耗时。
- 默认情况下会排除某些项目目录(如构建目录和测试源),不对其进行分析。
您也可以在 GitHub 中找到更新的 qodana.starter 配置文件。 此配置文件派生自 qodana.recommended 配置文件,仅执行重要检查。 以下是我们做出的主要更改:
- 禁用了代码样式和代码约定语义检查。
- 禁用了对代码库中不可执行部分(例如 Javadocs)的检查。
轻松地向 Qodana 添加插件
如果想要扩展 Qodana 并使用 JetBrains Marketplace 中的检查插件,只需将其 ID 添加到 qodana.yaml
文件中即可。
得益于 Marketplace 的最近更新,您现在可以直接在插件页面中复制其 ID。

可以通过两种方式安装插件所需的第三方软件:
- 使用
bootstrap
选项。 - 开发一个以
FROM jetbrains/qodana...
开头的自定义Dockerfile
。您可以使用 GitHub 上提供的 QodanaDockerfile
示例。
下面是一些您可能想要了解的值得注意并且非常受欢迎的插件:
- Grazie Professional,它提供了先进的自然语言书写辅助功能,包括拼写检查、语法校正、自然语言补全以及其他对文本书写和编辑有用的工具。
- CheckStyle,它可以在 IntelliJ IDEA 中使用 CheckStyle 对 Java 文件进行实时和按需扫描。
- Zero Width Characters Locator,它增加了一项检查,可以防止出现与源代码和资源中不可见的零宽度字符相关的一些难以发现的错误。
您可以在 JetBrains Marketplace 中通过此搜索找到更多插件。
Qodana 目前不支持付费插件,因此可能仍然存在与当前版本不兼容的插件。 今年,我们打算为 JetBrains Marketplace 上的 Qodana 插件引入适当的兼容性检查。
Linter 特定的更新
Qodana 中的新 JVM 检查
适用于 Kotlin/JS IR 编译器的检查
Kotlin 团队引入了新的 IR 编译器,它可以将 Kotlin 源代码迁移到 JavaScript。 为了简化迁移过程并发现潜在的错误,Qodana 现在支持以下检查:
NonExternalClassifierExtendingStateOrProps
使用从纯 JS 类派生的 Kotlin 接口和类(包括数据类),例如 React 的 State
和 Props
,可能导致 ClassCastExceptions
。 出现此类异常的原因是编译器试图将这些类的实例当作 Kotlin 对象来处理,但它们实际上来自 JS。
解决办法是将所有派生自纯 JS 类的类和接口转换为外部接口。 Qodana 将报告扩展 State
或 Props
使用的非外部分类器。

NonVarPropertyInExternalInterface
Kotlin/JS 代码中外部接口的属性不能为只读 (val
) 属性,因为只有在使用 js()
或 jso()
创建对象后才能为它们赋值。 解决办法是将外部接口的所有属性转换为 var
。
Qodana 会高亮显示不是 var
的所有属性,以便您可以转换它们。

SpringTransactionalMethodCallsInspection
Spring 框架让您可以使用代码注解管理应用程序事务。 只有标记为 `@Transaction`
的方法的外部调用才会在该事务下运行,这意味着自调用不会启动新的事务。 通过这项新检查,Qodana 可以高亮显示此类情况,因为它们会在事务管理中导致错误。

JUnitMixedFramework
在一个项目中使用多个版本的 JUnit 可能会导致错误,因为开发者会错误地在一个测试用例中混合不同的版本。 例如,考虑以下代码:

测试使用 JUnit4 运行,因此 JUnit5 的 BeforeEach
注解将不被处理,测试将失败并出现 NullPointerException。
默认情况下,Qodana 不检查测试源,因此要包含此检查,需要向 qodana.yaml
添加以下配置:
include: - name: JUnitMixedFramework paths: - <path-to-tests-directory>
MathRoundingWithIntArgument
此检查报告会对 Math
和 StrictMath
的 round()
、ceil()
、floor()
和 rint()
方法的调用。 对整数调用这些方法是多余的,这表明出现了错误,例如意外的整数除法。

Go 的第三方许可审核
如果您依赖开源组件、外包开发或重复使用 GitHub 等服务中的代码,则需要确保使用合适的许可。 您可能会意外地将具有受限许可的库导入软件代码库或忘记更新过期的许可。 如果是这样,您所在的机构可能会面临声誉和法律方面的风险。
为了尽量降低此类风险,我们去年为 Java、Kotlin、PHP 和 JavaScript 引入了许可审核功能。 在此版本中,我们增加了对 Go 的支持。 Qodana 将列出所分析仓库中的依赖项许可,并就有关其与项目许可兼容性的任何问题向您发出警告,如下例所示:

下面是依赖项许可列表示例:

针对 .NET 的更新
检查配置文件现在会遵循仓库设置
以前,.NET linter 的检查配置文件中的检查严重性设置基于从 ReSharper 获得的默认值。 但是,当某个项目已使用 ReSharper 和 Rider 的解决方案和项目配置层以及存储在仓库中的 .editorconfig
文件时,这种方式会导致重复设置。 这意味着如果您对其中任意层进行更改,就必须在 Qodana YAML 配置文件中进行相同的更改。
如果仓库中提供,检查配置文件现在会自动继承 ReSharper 和 .editorconfig
文件中的设置。 不再需要动手完成任何工作!
Qodana YAML 配置设置部分现已更名
qodana.yaml
配置文件以前包含 dot-net 部分,让您可以指定要打开的解决方案或项目,以及配置和平台选项。 此部分现已更名为 dotnet,从 Qodana 2023.2 版开始,将弃用 dot-net 名称。
如何升级到 Qodana 2023.1
如果使用 latest
Docker 标记运行 Qodana,则无需进行任何更改。 如果不是,请在要使用 Qodana 的 CI 工作流中更新到 2023.1 版。 可以在我们的文档中详细了解现有的 CI 集成。
并非所有检查都会自动启用。 要在分析中排除或包括特定检查,可能需要自定义检查配置文件。
这就是 Qodana 2023.1 的亮点! 有关详情,请查看版本说明。 我们希望您喜欢这个新版本。 如果您对未来的博客主题有建议,或者想详细了解 Qodana 可以如何帮助您和您的业务,请在此处发表评论,在 Twitter 上提及我们,或发送电子邮件至 qodana-support@jetbrains.com 与我们联系。
祝您开发愉快并轻松保持代码整洁!
您的 Qodana 团队
本博文英文原作者: