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


使用 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 文件有所帮助。如果有任何问题或建议,欢迎在评论区留言!

相关推荐

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

    2024-05-16 12:58:05       39 阅读
  2. Gradle任务动作:定义构建流程的魔法棒

    2024-05-16 12:58:05       23 阅读
  3. iOS定义初始化方法

    2024-05-16 12:58:05       30 阅读
  4. CMake官方教程8--定义命令和生成文件

    2024-05-16 12:58:05       39 阅读
  5. 深入Linux Core文件生成定义命名规则

    2024-05-16 12:58:05       35 阅读
  6. SQL 定义函数

    2024-05-16 12:58:05       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 12:58:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 12:58:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 12:58:05       87 阅读
  4. Python语言-面向对象

    2024-05-16 12:58:05       96 阅读

热门阅读

  1. 数学建模(科普)

    2024-05-16 12:58:05       40 阅读
  2. IT行业的现状与未来:技术驱动下的新世界

    2024-05-16 12:58:05       40 阅读
  3. js 数组filter使用

    2024-05-16 12:58:05       35 阅读
  4. RIP、OSPF、BGP等协议及华为路由器配置总结

    2024-05-16 12:58:05       37 阅读
  5. 40-2 了解与安装堡垒机

    2024-05-16 12:58:05       33 阅读
  6. Leetcode 404:左叶子之和

    2024-05-16 12:58:05       36 阅读
  7. 力扣:131. 分割回文串

    2024-05-16 12:58:05       31 阅读
  8. 力扣 72. 编辑距离 python AC

    2024-05-16 12:58:05       33 阅读
  9. 课时126:awk实践_进阶知识_内置函数1

    2024-05-16 12:58:05       32 阅读