This message was deleted.
# community-support
s
This message was deleted.
v
Property is the right way. You can only inject into the constructor what is an injectable service by Gradle. But I'd use
Copy code
abstract val jvm: Property<Boolean>
Dunnot what
Delegates.notNull
does.
👍 1
g
I'm using
jvm
to return the corresponding
targetDir
later on
Copy code
@get:Input
abstract val jvm: Property<Boolean>

@get:OutputDirectory
val targetDir: DirectoryProperty
    get() {
        val platform = if(jvm.get()) "jvm" else "nonJvm"
        val dir = project.layout.buildDirectory.dir("generated/$platform")
        return project.objects.directoryProperty().convention(dir)
    }
Copy code
val generateJvmCode by registering(GenerateCode::class) { jvm.set(true) }
val generateNonJvmCode by registering(GenerateCode::class) { jvm.set(false) }
kotlin.sourceSets {
    named("jvmMain") { kotlin.srcDir(generateJvmCode) }
    named("nativeMain") { kotlin.srcDir(generateNonJvmCode) }
//    named("jsMain") { kotlin.srcDir(generateNonJvmCode) }
}
however, on sync:
com.intellij.openapi.externalSystem.model.ExternalSystemException: Could not create task ':generateJvmCode'.
Could not create task of type 'GenerateCode'.
Cannot query the value of task ':generateJvmCode' property 'jvm' because it has no value available.
is a dependency between properties allowed?
solved this way
Copy code
abstract class GenerateJvmCode : GenerateCode(true)
abstract class GenerateNonJvmCode : GenerateCode(false)

abstract class GenerateCode(
    @Internal
    val jvm: Boolean): DefaultTask() {
v
Copy code
@get:Inject
abstract val layout: ProjectLayout

@get:Input
abstract val jvm: Property<Boolean>

@get:OutputDirectory
val targetDir = jvm.flatMap {
    val platform = if (it) "jvm" else "nonJvm"
    layout.buildDirectory.dir("generated/$platform")
}
g
uhm, let me try that..
is it mandatory for
layout
to be extracted into a property itself?
v
No, but it is better to inject it and use it than to use
project
usually. Accessing
project
of a task during configuration time is ok, during execution time it is deprecated and will be forbidden. So better to simply avoid using it whenever possible.
👍 1
g
thanks, it seems working flawless
👌 1