一个输出当前时间的Gradle Task
// 1. 显式定义任务类(确保它是自包含的)
abstract class GenerateBuildTimeTask : DefaultTask() {
// 所有的输入输出都必须是 Property 类型
@get:OutputDirectory
abstract val outputDir: DirectoryProperty
@get:Input
abstract val buildTime: Property<String>
@TaskAction
fun generate() {
// 执行逻辑只从 Property 中取值,不依赖外部 project 对象
val time = buildTime.get()
val packageName = "com.xxx.cmp.generated"
val outputFile = outputDir.file("BuildTimeInfo.kt").get().asFile
outputFile.parentFile.mkdirs()
outputFile.writeText("""
package $packageName
object BuildTimeInfo {
const val BUILD_TIME = "$time"
}
""".trimIndent())
}
}
// 2. 注册任务
val buildTimeProvider = provider { SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()) }
val generateBuildTimeTask = tasks.register<GenerateBuildTimeTask>("generateBuildTime") {
// 关键:在这里把值“传”进去,而不是在 TaskAction 里动态计算
buildTime.set(buildTimeProvider)
outputDir.set(layout.buildDirectory.dir("generated/buildtime/commonMain/kotlin"))
// 强制任务执行,虽然配置缓存会跳过配置阶段,但任务本身要标记为不可缓存
outputs.upToDateWhen { false }
}
// 3. 配置关联(注意这里不要使用闭包捕获)
val kmpExtension = extensions.findByType(KotlinMultiplatformExtension::class.java)
if (kmpExtension != null) {
kmpExtension.sourceSets.getByName("commonMain").kotlin.srcDir(generateBuildTimeTask.map { it.outputDir })
// 自动挂载依赖
tasks.matching { it.name.startsWith("compileKotlin") }.configureEach {
dependsOn(generateBuildTimeTask)
}
}