使用 Gradle 自定义任务生成初始化 SQL 文件

admin2024-05-15  0


使用 Gradle 自定义任务生成初始化 SQL 文件

在现代应用开发中,自动化生成初始化 SQL 文件是一项非常实用的功能。本文将介绍如何使用自定义的 Gradle 任务来生成这些文件,重点介绍 GenerateInitSqlTask 的具体用法。

任务类 GenerateInitSqlTask 简介

GenerateInitSqlTask 是一个继承自 DefaultTask 的自定义 Gradle 任务,主要用于生成初始化 SQL 文件。以下是它的关键属性和方法:

关键属性

  • inputDir:输入目录,存放 FreeMarker 模板文件。
  • outputDir:输出目录,生成的 SQL 文件将存放于此。
  • insertDemoData:布尔值,决定是否插入演示数据。
  • arguments:额外的参数,可以传递到模板中使用。

任务方法

@TaskAction
fun generateInitSql() {
    // 检查输出目录是否在项目目录内
    if (!outputDir.asFile.get().canonicalPath.startsWith(project.projectDir.canonicalPath)) 
        throw GradleException("OutputDir must be within the project directory")

    // 检查输出目录中是否已有 SQL 文件,如果有则跳过生成
    val outputFiles = project.fileTree(outputDir).matching { include("**/*.sql") }
    if (!outputFiles.isEmpty) {
        logger.warn("Skipping init sql files generation; files already exists at ${outputDir.get()}")
        return
    }

    // 配置 FreeMarker
    val inputDirPath = inputDir.get().asFile.canonicalPath
    val freemarkerConfiguration = Configuration(Configuration.VERSION_2_3_30).apply { 
        setDirectoryForTemplateLoading(inputDir.get().asFile) 
    }
    freemarkerConfiguration.outputEncoding = "UTF-8"
    freemarkerConfiguration.defaultEncoding = "UTF-8"

    // 处理模板文件
    inputDir.asFileTree.matching { include("**/*.ftl") }.forEach {
        val templateName = it.canonicalPath.substring(inputDirPath.length).removePrefix("/")
        val template = freemarkerConfiguration.getTemplate(templateName)
        val destFile = outputDir.get().file(templateName.replaceAfterLast(".", "sql")).asFile
        val dataModel = mapOf(
            InitSql.INSERT_DEMO_DATA_ARGUMENT_NAME to insertDemoData.get(),
            InitSql.DEMO_IMAGE_URL_PREFIX_ARGUMENT_NAME to DEMO_IMAGE_URL_PREFIX,
            "md5" to Md5Method
        ) + arguments.get()

        if (!destFile.parentFile.exists()) destFile.parentFile.mkdirs()
        template.process(dataModel, OutputStreamWriter(FileOutputStream(destFile), StandardCharsets.UTF_8))
    }

    logger.warn("init sql files outputDir: ${outputDir.get()}, arguments: ${arguments.get()}")
}

在 Gradle 脚本中配置任务

build.gradle.kts 文件中配置 GenerateInitSqlTask 任务如下:

tasks.register<GenerateInitSqlTask>("generateInitSql") {
    inputDir.set(file("src/main/resources/sqlTemplates")) // 设置输入目录路径
    outputDir.set(file("$buildDir/generated/sql"))        // 设置输出目录路径
    insertDemoData.set(true)                              // 是否插入演示数据
    arguments.put("someKey", "someValue")                 // 传递其他参数
}

配置说明

  • 输入目录inputDir.set(file("src/main/resources/sqlTemplates"))
    • 指定存放 FreeMarker 模板文件的目录。
  • 输出目录outputDir.set(file("$buildDir/generated/sql"))
    • 指定生成的 SQL 文件的存放目录。
  • 插入演示数据insertDemoData.set(true)
    • 决定是否插入演示数据。
  • 额外参数arguments.put("someKey", "someValue")
    • 传递额外参数到模板中使用。

总结

通过自定义 Gradle 任务 GenerateInitSqlTask,可以高效地生成初始化 SQL 文件。关键在于正确配置输入输出目录,以及根据需要传递参数。这样可以使数据库初始化过程自动化,减少手动编写 SQL 文件的繁琐工作,提高开发效率。


希望这篇文章对你理解和使用自定义 Gradle 任务生成初始化 SQL 文件有所帮助。如果有任何问题或建议,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!