如何在 finalizedBy 中调用任务时 运行 带有参数的 JavaExec gradle 任务?
How to run a JavaExec gradle task with arguments when the task is called in finalizedBy?
我创建了一个连接到数据库并进行一些检查的 JavaExec 任务。在我的飞行路线 build.gradle 中,我这样称呼任务:
flywayMigrate.finalizedBy(rootProject.checkOracleStandards)
任务运行良好,但问题是连接 url、用户和密码在连接到数据库并进行检查的程序中被硬编码。我想将它们作为参数传递给自定义任务。
如何在 flywayMigrate 后 运行 带有参数的自定义任务?
这是我的任务 gradle 文件的样子:
apply plugin: 'java'
dependencies {
implementation rootProject.files("libs/check-oracle-db-standards-1.jar")
implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '21.3.0.0'
implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.13'
implementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}
task checkOracleStandards(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'com.package.checkoracledbstandards.Main'
}
由于 share/pass 任务之间参数的最佳方式是通过文件,让任务将它们写入某处的文件,然后让您的 checkOracleStandards
任务从该文件加载它们。
确保将参数写入 doLast
块中的文件,以避免每次 gradle 同步时都有任务 运行。
最后,让您的 checkOracleStandards
任务打开文件,解析参数并以某种方式使用它们。
val outputPath = "${rootProjectPath}/build/check_params" <-- you may not want to use a folder for this
val paramFile = file("${outputPath}/check_params")
doLast {
if (paramFile.exists().not()) {
paramFile.writeText()
File(outputPath)
.walk()
.maxDepth(1)
.filter {
it.isFile
&& it.name.endsWith("_params")
}
.forEach {
println("Passing params of ${it.name} into ${paramsFile.absolutePath}")
// PARSE params here
paramsFile.appendText("url: ${use_your_real_url}\tuser: ${use_your_real_user}\tpass: ${use_the_password}")
paramsFile.appendText("\n")
}
如果不确定,应该在你的 checkOracleStandards
任务之前将这部分作为“传递参数”任务的一部分到 运行,然后修改你的 checkOracleStandards
任务以从中读取参数归档并使用它们。
编辑:
让我添加一些与答案本身无关的说明 - 我只会发表评论;然而 SO 改变了一些东西,我的浏览器目前无法在任何地方留下评论,所以我给了你一个应该只是评论的答案。
我创建了一个连接到数据库并进行一些检查的 JavaExec 任务。在我的飞行路线 build.gradle 中,我这样称呼任务:
flywayMigrate.finalizedBy(rootProject.checkOracleStandards)
任务运行良好,但问题是连接 url、用户和密码在连接到数据库并进行检查的程序中被硬编码。我想将它们作为参数传递给自定义任务。
如何在 flywayMigrate 后 运行 带有参数的自定义任务?
这是我的任务 gradle 文件的样子:
apply plugin: 'java'
dependencies {
implementation rootProject.files("libs/check-oracle-db-standards-1.jar")
implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '21.3.0.0'
implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.13'
implementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}
task checkOracleStandards(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
main = 'com.package.checkoracledbstandards.Main'
}
由于 share/pass 任务之间参数的最佳方式是通过文件,让任务将它们写入某处的文件,然后让您的 checkOracleStandards
任务从该文件加载它们。
确保将参数写入 doLast
块中的文件,以避免每次 gradle 同步时都有任务 运行。
最后,让您的 checkOracleStandards
任务打开文件,解析参数并以某种方式使用它们。
val outputPath = "${rootProjectPath}/build/check_params" <-- you may not want to use a folder for this
val paramFile = file("${outputPath}/check_params")
doLast {
if (paramFile.exists().not()) {
paramFile.writeText()
File(outputPath)
.walk()
.maxDepth(1)
.filter {
it.isFile
&& it.name.endsWith("_params")
}
.forEach {
println("Passing params of ${it.name} into ${paramsFile.absolutePath}")
// PARSE params here
paramsFile.appendText("url: ${use_your_real_url}\tuser: ${use_your_real_user}\tpass: ${use_the_password}")
paramsFile.appendText("\n")
}
如果不确定,应该在你的 checkOracleStandards
任务之前将这部分作为“传递参数”任务的一部分到 运行,然后修改你的 checkOracleStandards
任务以从中读取参数归档并使用它们。
编辑: 让我添加一些与答案本身无关的说明 - 我只会发表评论;然而 SO 改变了一些东西,我的浏览器目前无法在任何地方留下评论,所以我给了你一个应该只是评论的答案。