[英]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.