kotlin - Gradle Kotlin脚本,尝试通过内置变量分配classpatch

标签 kotlin gradle-kotlin-dsl

为什么这个:

val runVersionSplicer by tasks.registering(type = JavaExec::class) {
    classpath = sourceSets.main.runtimeClasspath // error
    main = "com.concurnas.build.VersionSplicer"
}

返回:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public val NamedDomainObjectContainer.runtimeClasspath: NamedDomainObjectProvider defined in org.gradle.kotlin.dsl



虽然这工作正常吗?
val runVersionSplicer by tasks.registering(type = JavaExec::class) {
    classpath = sourceSets["main"].runtimeClasspath
    main = "com.concurnas.build.VersionSplicer"
}

我知道sourceSets.main是这样定义的:
val org.gradle.api.tasks.SourceSetContainer.`main`: NamedDomainObjectProvider<org.gradle.api.tasks.SourceSet>
    get() = named<org.gradle.api.tasks.SourceSet>("main")

但是不应该替换sourceSets["main"]构造吗?

最佳答案

因为其中一个是提供者,另一个是对象。

  • sourceSets.main使用您发现的引擎盖下的NamedDomainObjectCollection.named。如果查看named的javadoc,则会看到它返回以下内容:

    A Provider that will return the object when queried. The object may be created and configured at this point, if not already


  • sourceSets["main"]直接返回源集,因为它改用NamedDomainObjectCollection.getByName whi:

    The object with the given name. Never returns null.



  • 因此,这两个是等效的:
    sourceSets.main.get()
    sourceSets["main"]
    
    在Groovy中,以下内容等效:
    sourceSets.main
    sourceSets["main"]
    sourceSets.getAt("main")
    
    这是getAt类实现的NamedDomainObjectCollection方法的所有不同语法。这就是为什么您在Groovy脚本中看不到很多get()的原因,而在Kotlin DSL脚本中却看到了很多的原因。

    关于kotlin - Gradle Kotlin脚本,尝试通过内置变量分配classpatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085586/

    相关文章:

    java - @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为空

    android - 没有堆栈跟踪的Kotlin/Android应用程序崩溃

    android - 如何在 Kotlin 1.3 中更新协程中的 UI

    android - 使用replace()后如何保存 fragment 的实例状态?

    intellij-idea - 如何在IntelliJ中更改默认的Gradle包装器和构建文件?

    java - Ktor 创建一个额外的 Java 进程

    android - Android Instrumented Test有时会起作用,有时会无法生成覆盖率

    bash - 使 Gradle 任务可以访问环境变量

    android - 如何修复 Kotlin Multiplatform Mobile gradle 红色错误

    java - 使用库时出现 ClassNotFoundException 异常