簡體   English   中英

如何抑制特定的 Kotlinc/Javac 編譯器警告?

[英]How to suppress specific Kotlinc/Javac compiler warnings?

如何在類似於JavaCompile Gradle抑制KotlinCompile deprecations

JavaCompile(有效):

tasks.withType(JavaCompile) {
    configure(options) {
        compilerArgs << '-Xlint:-deprecation'
    }
}

KotlinCompile(不起作用):

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    kotlinOptions {
        freeCompilerArgs = ["-Xjavac-arguments=-Xlint:-deprecation"]
    }
}

參考:

類似問題:

目前 Kotlin 不支持 Surpressing compiler warnings。 他們確實有一些類別需要壓制。 但與此不同的是,唯一的方法是:

@Suppress("DEPRECATION")

有時,僅通過輸入應該在運行時工作的注釋,Surpress 將無法工作。 您可能需要添加如下內容

val foo = error.asDynamic().response
if (foo is AxiosResponse<String>) {
    @Suppress("UNCHECKED_CAST")
    val response = foo as AxiosResponse<String>
}

這不是你的情況。 但顯然其他人也有類似的問題。 我建議簡要看一下reddit。 這也不是上面的情況,但可以引導你。

https://www.reddit.com/r/Kotlin/comments/bsgk5w/what_do_i_have_to_do_to_suppress_my_unchecked/

看起來在KotlinCompile任務上定義的kotlinOptions屬性上有一個suppressWarnings選項。 將其設置為true可以做你想要的。

這是你怎么做的:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
    kotlinOptions {
        suppressWarnings = true
    }
}

如果您的目標是抑制棄用,因此您可以使構建在彼此的 Kotlin 警告上失敗,那么這就是我的經驗。

有一種方法可以配置 Kotlin 編譯器,使其在每次警告時都失敗。 只需將以下配置添加到您的build.gradle文件中:

// For Android Project
android {
    kotlinOptions {
        allWarningsAsErrors = true
    }
}
// For non Android Project
compileKotlin {
    kotlinOptions {
        allWarningsAsErrors = true
    }
}

但是在啟用allWarningsAsErrors標志后,Kotlin 編譯器將在每次棄用代碼使用后失敗。 不幸的是,Kotlin 不支持忽略那些已棄用的警告或避免失敗。

以下 Gradle 腳本為此問題提供了解決方案。

import org.gradle.api.Project
import org.gradle.api.internal.GradleInternal
import org.gradle.configurationcache.extensions.serviceOf
import org.gradle.internal.logging.events.operations.LogEventBuildOperationProgressDetails
import org.gradle.internal.operations.BuildOperationDescriptor
import org.gradle.internal.operations.BuildOperationListener
import org.gradle.internal.operations.BuildOperationListenerManager
import org.gradle.internal.operations.OperationFinishEvent
import org.gradle.internal.operations.OperationIdentifier
import org.gradle.internal.operations.OperationProgressEvent
import org.gradle.internal.operations.OperationStartEvent

val kotlinWarnings = mutableListOf<String>()
val buildOperationListener = object : BuildOperationListener {
    override fun started(buildOperation: BuildOperationDescriptor, startEvent: OperationStartEvent) {
    }

    override fun progress(operationIdentifier: OperationIdentifier, progressEvent: OperationProgressEvent) {
        val log = progressEvent.details
        if (log is LogEventBuildOperationProgressDetails) {
            if (log.message.contains("w:") && !log.message.contains("is deprecated.") && !kotlinWarnings.contains(log.message)) {
                kotlinWarnings.add(log.message)
            }
        }
    }

    override fun finished(buildOperation: BuildOperationDescriptor, finishEvent: OperationFinishEvent) {
    }
}
val gradleInternal = project.gradle as GradleInternal
val buildOperationListenerManager = gradleInternal.serviceOf() as BuildOperationListenerManager?
buildOperationListenerManager?.addListener(buildOperationListener)
project.gradle.buildFinished {
    buildOperationListenerManager?.removeListener(buildOperationListener)
    if (kotlinWarnings.isNotEmpty()) {
        kotlinWarnings.forEach { project.logger.warn(it) }
        throw RuntimeException("Kotlin warning found")
    }
}

基本上,一個BuildOperationListener被添加到 Gradle 構建中,因此您可以監聽每個控制台日志。 檢查每個日志以搜索 Kotlin 警告,但忽略已棄用的使用警告。 最后,如果項目有 Kotlin 警告會拋出異常


以下文章提供了有關此主題的更多信息: 在 Kotlin 上構建失敗警告

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM