gradle 如何访问由KotlinDSL生成的自定义代码?

ha5z0ras  于 4个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(75)

我在Android Studio中创建了一个默认的 Empty Views Activity 项目,使用Kotlin作为语言,使用KotlinDSL作为构建配置语言。然后我将以下代码附加到应用级别build.gradle.kts

abstract class CustomTask : DefaultTask() {
    @get:Input
    var generatedCodePath = ""

    @TaskAction
    fun run() {
        val path = File(generatedCodePath).resolve(
            "custom_code/debug/out/com/example/app/CustomCode.kt"
        )
        path.parentFile.mkdirs()
        path.writeText("""
            #package com.example.app
            #
            #public fun customCode() {
            #    println("Hello from custom code!")
            #}
        """.trimMargin("#"))
    }
}

tasks.register<CustomTask>("customTask") {
    generatedCodePath = "$buildDir/generated"
}

tasks.named("preBuild").configure {
    dependsOn("customTask")
}

字符串
这个想法是新的CustomTask将在每次构建时生成一个文件。在同步和重建之后,我已经检查了文件CustomCode.kt确实已经在app\build\generated\custom_code\debug\out\com\example\app\CustomCode.kt中正确生成。
现在,我尝试将函数customCode从生成的文件导入到MainActivity中,但遇到了无法解析的引用。

package com.example.gradlegenerate

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.app.* // Unresolved reference: app
import com.example.app.CustomCodeKt // Unresolved reference: app

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}


请注意,生成的文件位于app包中,而Activity位于gradlegenerate包中,因此没有名称冲突。
我尝试将生成的文件添加到应用程序级别build.gradle.kts的源集中,并重复同步&重建&导入,但没有运气。

android {
    sourceSets {
        named("main") {
            java.srcDir("$buildDir/generated/debug/out")
        }
    }
}


我错过了什么?

t3psigkw

t3psigkw1#

问题是生成的代码的路径与添加到源代码集中的路径不匹配。
app/build.gradle.kts中,我更正了源代码集。

sourceSets {
    named("main") {
        java.srcDir("$buildDir/generated/custom_code/debug/out")
    }
}

字符串
注意问题文本中缺少的字符串custom_code
现在我终于可以在MainActivity中导入和使用customCode函数了。

package com.example.gradlegenerate

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.app.customCode

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        customCode()
    }
}


当我构建并运行应用程序时,输出由Logcat注册。

System.out    com.example.gradlegenerate    I    Hello from custom code!

相关问题