gpt4 book ai didi

gradle - Gradle:根据环境或其他属性,将插件子任务标记为不可运行

转载 作者:行者123 更新时间:2023-12-03 04:01:20 25 4
gpt4 key购买 nike

我刚刚测试了Flyway的数据库迁移,并对其功能和工作流程感到惊讶。

但是,存在一个问题:Flyway也可以执行 clean 任务,该任务可以有效地删除正在访问的模式中的所有表和过程。

例如,此子任务应可在开发环境中运行,但不能在生产环境中运行:有人可能误解了其含义并错误地杀死了生产DB。

是否可以禁用(或简单地删除)插件的子任务?我可以做类似的事情:

flywayClean {
enabled = project.hasProperty('devenv')
if(!enabled) {
throw new StopExecutionException("Disabled on production servers.")
}
}

但是不幸的是,这使构建无法完成。理想情况下,我想在从另一个任务或从命令行运行特定任务时仅抛出这样的异常。

我可以用Gradle做到吗?

编辑:

发布问题后不久,我注意到 flyway配置选项还包括 cleanDisabled选项,该选项可以完全满足我的期望。这样就不必删除问题了:如果插件本身没有这样的选项,那么通常可以这样做吗?

最佳答案

是的,Gradle中的每个任务都有一个闭包列表,该闭包将在任务运行时执行。您可以通过添加“doFirst”闭包将任何闭包添加到该列表的开头。

不要使用启用的变量,而是直接检查属性。否则你会得到

Cannot call Task.setEnabled(boolean) on task ':flywayClean' after task has started execution.



如果您希望整个运行失败,则抛出常规Exception,StopExecutionException将仅停止当前任务执行其余任务关闭,而不会出现错误消息。
flywayClean {
doFirst{
if(!project.hasProperty('devenv')) {
throw new Exception("Disabled on production ervers.")
}
}
}

替代:

执行此操作的另一种方法是根据条件跳过任务。由于我们尚未开始执行任务,因此您可以在此处更改已启用的变量。请记住向用户打印原因,以便他理解为什么跳过任务。
gradle.taskGraph.whenReady { taskGraph ->
if (!project.hasProperty('devenv')){
taskGraph.allTasks.find {it.name == 'flywayClean'}.each{
println 'Disabling flywayClean due to missing property "devenv"'
it.enabled = false
}
}
}

关于gradle - Gradle:根据环境或其他属性,将插件子任务标记为不可运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40153321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com