You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅对Git变更的Kotlin文件执行Ktlint检查?

问题修复方案

你的脚本无法实现预期效果的核心原因:ktlintCheck Gradle任务不支持直接接收文件路径参数,你通过xargs传递的文件列表会被Gradle忽略,任务仍会扫描整个项目的Kotlin文件。

下面提供两种可行的修复方案:

方案1:直接使用ktlint命令行工具(推荐)

如果你的环境已安装ktlint(通过Homebrew/SDKMAN安装,或项目根目录有ktlint可执行文件),可以跳过Gradle任务,直接调用ktlint命令检查变更文件:

修改后的bash脚本:

#!/bin/bash

BASE_BRANCH="main"

MODIFIED_FILES=$(git diff --name-only "$BASE_BRANCH" -- '*.kt')

if [ -n "$MODIFIED_FILES" ]; then
  echo "Running Ktlint on modified files..."
  # 将变更文件列表传给ktlint命令
  echo "$MODIFIED_FILES" | xargs ktlint
else
  echo "No modified Kotlin files detected"
fi

注意:如果ktlint放在项目根目录,将脚本中的ktlint改为./ktlint即可。

方案2:通过Gradle配置指定检查文件

若必须依赖Gradle的ktlintCheck任务,需先在构建脚本中添加动态配置,让任务接收指定文件列表:

第一步:修改项目构建脚本

Kotlin DSL版本(build.gradle.kts)

tasks.withType<org.jlleitschuh.gradle.ktlint.KtlintCheckTask> {
    // 读取Gradle属性传递的文件列表,动态设置检查范围
    if (project.hasProperty("filesToCheck")) {
        val targetFiles = (project.property("filesToCheck") as String).split(",")
        source(files(targetFiles))
    }
}

Groovy版本(build.gradle)

tasks.withType(org.jlleitschuh.gradle.ktlint.KtlintCheckTask) {
    if (project.hasProperty('filesToCheck')) {
        def targetFiles = project.property('filesToCheck').split(',')
        source(files(targetFiles))
    }
}

第二步:修改bash脚本

将换行分隔的文件列表转为逗号分隔格式,通过Gradle属性传递给任务:

#!/bin/bash

BASE_BRANCH="main"

MODIFIED_FILES=$(git diff --name-only "$BASE_BRANCH" -- '*.kt')

if [ -n "$MODIFIED_FILES" ]; then
  echo "Running Ktlint on modified files..."
  # 转换文件列表格式为逗号分隔
  FILES_LIST=$(echo "$MODIFIED_FILES" | paste -sd "," -)
  ./gradlew ktlintCheck -PfilesToCheck="$FILES_LIST"
else
  echo "No modified Kotlin files detected"
fi

额外修正:原脚本中的echo "Any files detected"是笔误,已改为No modified Kotlin files detected以避免歧义。

内容的提问来源于stack exchange,提问作者Guilherme Hepfener

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:55:10