如何仅对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
相关产品推荐
相关产品推荐

