所以,我在我的gradle构建中使用了一个插件(该插件是org.flywaydb.flyway,但这并不是真的相关)。我希望验证调用者在执行此插件的任务时是否已通过运行时参数传递,而不是在其他任务正在执行时传递。
我根据提供的参数将选项传递给flyway插件。我想要在执行flywayTask并且没有提供参数时返回错误。当正在运行非飞路任务时,我不想验证是否提供了参数。
gradle -PmyParam=myValue flywayMigration
=>应该运行代码,应该没有错误
gradle flywayMigration
=>应该运行代码并且应该产生错误(因为没有提供参数)
gradle jar
=>不应该运行代码,不应该产生错误
我一直在阅读有关gradle配置和执行的信息,但是我仍然无法找到一种方法,只有在flyway插件执行或执行特定的flyway任务时才运行代码。
这是我目前的代码:
if(gradle.taskGraph.hasTask("flywayMigrate")) {
flyway {
def dbCode, dbUser, dbPassword, dbUrl
if (!project.hasProperty("db_env")) {
throw new GradleException("Expected db_env property to be supplied for migration task. Can be passed" +
" at command line e.g. [gradle -Pdb_env=ex1 flywayMigrate]")
} else {
// do stuff
}
user = balh
password = blah
url = blah
driver = 'oracle.jdbc.OracleDriver'
cleanDisabled = true
baselineOnMigrate = true
baselineVersion = '1.0.0'
}
}
要清楚,我只想要这段代码:
if (!project.hasProperty("db_env")
运行飞路任务。
上面的代码抛出了这个错误:
Task information is not available, as this task execution graph has not been populated.
我在这里做了一些尝试,任何建议都会受到赞赏。
答案 0 :(得分:2)
我不是很清楚,如果提供了这个属性,你究竟想做什么,但我认为,你可以在不访问任务图的情况下做到这一点,只是尝试使用doFirst
关闭flywayMigrate
任务。就像这样:
flywayMigrate.doFirst {
if(!project.hasProperty("db_env")) {
throw ...
} else {
//Do something
}
}
让您的插件配置免于任何其他逻辑。
至于例外,您是否曾尝试等到图表准备就绪?通常按如下方式完成:
gradle.taskGraph.whenReady {taskGraph ->
if(gradle.taskGraph.hasTask("flywayMigrate")) {
...
}
}
更新:回答评论中的问题
如果我可以将doFirst附加到多个任务中?
是的,你可以使用像:
这样的东西//declare task names
def names = ["taskA", "taskB", "taskC"]
tasks.findAll {it ->
//filter tasks with names
if (it.name in names)
return it
}.each { it ->
//add some extra logic to it's doFirst closure
it.doFirst {
println 'hello'
}
}
在此配置之前,请检查所有任务是否存在。