一个输出当前时间的Gradle Task

7 阅读1分钟

一个输出当前时间的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)
    }
}