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