我希望能够在使用Android Studio构建项目时运行lint任务,以确保遵循lint规则。
我尝试过使用任务依赖关系,但没有成功。我的TeamCity构建服务器使用构建任务来运行lint任务,所以那个做得很好。然而,当我选择调试版本时,Android Studio似乎会交替使用generateDebugSources
和compileDebugJava
任务。
这是我在build.gradle中尝试的内容:
assemble.dependsOn lint
我希望能够在使用Android Studio构建项目时运行lint任务,以确保遵循lint规则。
我尝试过使用任务依赖关系,但没有成功。我的TeamCity构建服务器使用构建任务来运行lint任务,所以那个做得很好。然而,当我选择调试版本时,Android Studio似乎会交替使用generateDebugSources
和compileDebugJava
任务。
这是我在build.gradle中尝试的内容:
assemble.dependsOn lint
如果你只是想在Android Studio项目默认运行配置之前配置lint检查,而不影响gradle任务的设置,可以按照以下步骤操作。
:app:check
)check
步骤移动到现有的Gradle-aware make
步骤之前现在,Android Studio将运行lint检查,并在出现任何lint错误时失败构建。
要运行代码检查和分析,请选择Analyze > Inspect Code
。
您应该看到一个包含所有问题的漂亮窗口。
如需更多信息,请查看在Android Studio中运行lint。
我进行了更多研究,请尝试将此内容添加到您的build.gradle
文件中。
lintOptions {
abortOnError true
}
你可以对 build.gradle
应用许多选项
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def lintTask = tasks["lint${variant.name.capitalize()}"]
output.assemble.dependsOn lintTask
}
}
...
}
这使得你所有的组装任务都依赖于 lint 任务,在 Android Studio 执行每个 assemble 调用之前有效地运行它们。
编辑
使用 Android Gradle 插件 3.3 和 Gradle 5.x,这是一个使用 Kotlin 脚本修订过的版本:applicationVariants.all {
val lintTask = tasks["lint${name.capitalize()}"]
assembleProvider.get().dependsOn.add(lintTask)
}
def
代替 val
。 - Yoel Gluschnaider只需运行“check”任务
./gradlew clean check assembleRelease
以下是我的解决方案,可适用于在Android Studio中点击Build和Make Project的情况:
android {
..
afterEvaluate {
applicationVariants.all {
variant ->
// variantName: e.g. Debug, Release
def variantName = variant.name.capitalize()
// now we tell gradle to always start lint after compile
// e.g. start lintDebug after compileDebugSources
project.tasks["compile${variantName}Sources"].doLast {
project.tasks["lint${variantName}"].execute()
}
}
}
}
project.tasks["compile${variantName}Sources"].dependsOn("lint${variantName}")
。 - Sofien Rahmouni如果你想在不影响gradle任务配置的情况下,强制让Android Studio项目在默认运行配置之前运行lint检查,并且你想在gradle构建系统中完成这个操作,那么你可以按照以下方式,在应用程序模块的build.gradle文件中,在android
块外面添加以下代码块:
android {
....
lintOptions {
abortOnError true
}
}
tasks.whenTaskAdded { task ->
if (task.name == 'compileDevDebugSources') {
task.dependsOn lint
task.mustRunAfter lint
}
}
将 compileDevDebugSources
替换为您已经定义的所需构建变量,例如:compileReleaseSources
、compileDebugSources
、compileStagingDebugSources
等。
此方法在 Android Studio 3.0 上已测试有效。
我只是修改了@Yoel Gluschnaider的回答。
对我来说,如果我使用Val,会显示以下错误:
无法为类型com.android.build.gradle.internal.api.ApplicationVariantImpl
的对象设置未知属性“lintTask”。
所以我进行了替换。
applicationVariants.all {
def lintTask = tasks["lint${name.capitalize()}"]
assembleProvider.get().dependsOn.add(lintTask)
}
更高效的答案如下所示 Gradle 任务配置避免 。
Gradle kts 版本
android {
applicationVariants.configureEach {
val variantName =
name.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ENGLISH) else it.toString() }
val lintTaskName = "lint$variantName"
val lintTask = tasks.named("lint$variantName")
assembleProvider.dependsOn(lintTask, tasks.named("detekt$variantName"))
}
}
android {
applicationVariants.configureEach {
def variantName = name.capitalize()
def lintTaskName = "lint$variantName"
def lintTask = tasks.named("lint$variantName")
assembleProvider.configure {
dependsOn lintTask
}
}
}
assembleProvider.get()
,这违背了避免配置的目的configureEach
,在需要时配置每个任务,而不是急切地配置