未解析的参考:build.gradle.kts 中的tasks.jib.doLast

问题描述 投票:0回答:1

我已经通过 build.gradle 成功构建了旧的 Kotlin 项目:

tasks.jib.doLast {}

但我需要将其更改为 build.gradle.kts:

 plugins {
  kotlin("jvm")
  id("application")
  id("com.google.cloud.tools.jib")
}

group = "com.myproject"
version = "1.0-SNAPSHOT"

application {
    mainClass.set("MainKt")
}
dependencies {
  annotationProcessor("org.springframework.boot:spring-boot-starter-data-jdbc")
  annotationProcessor("com.github.blagerweij:liquibase-sessionlock")
  annotationProcessor("org.liquibase:liquibase-core:4.8.0")
  annotationProcessor("org.postgresql:postgresql")
}

kotlin {
  jvmToolchain {
    languageVersion.set(JavaLanguageVersion.of("17"))
  }
}

jib {
  from.image = "amazoncorretto:17-alpine-jdk"
  to {
    image = "image"
    tags = setOf("$version")
  }
  container.user = "nobody"
}


tasks.jib.configure {
  dependsOn(provider {
    tasks.jibDockerBuild
  })
}

tasks.jib.doLast {
//some logic
}

现在我收到错误:

Line 32: doLast {
           ^ Unresolved reference: tasks.jib.doLast

也许我应该使用tasks.withType?但对于这个配置它也没有定义

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    kotlinOptions {
        jib.doLast { }
    }
}

感谢您的所有建议。

kotlin gradle gradle-kotlin-dsl
1个回答
0
投票

Groovy 代码

tasks.jib.doLast {
  // someLogic
}

在 Kotlin 中应该替换为

tasks.jib.configure {
  doLast {
    // someLogic
  }
}

事实上,您可以将该配置包含在之前的配置块中,因为它正在执行相同的操作:

tasks.jib.configure {
  dependsOn(provider {
    tasks.jibDockerBuild
  })
  doLast {
    //some logic
  }
}

请注意,这种差异是因为在 Kotlin DSL 中,

tasks.jib
是一个
TaskProvider
(通过 自动生成的访问器,因为它是在插件中定义的),但在 Groovy 中,它是
jib
Task
对象本身(通过 Groovy/Gradle 魔法,因为
tasks
NamedDomainObjectCollection

我鼓励您单击/悬停在构建脚本中的对象上;如果您使用合适的 IDE,这将告诉您它们是什么类型,并引导您找到可供它们使用的 API。

© www.soinside.com 2019 - 2024. All rights reserved.