【发布时间】:2017-01-23 12:45:31
【问题描述】:
我发现每次运行 gradle build 时自动调用 Flyway's migrate command 非常有用。
Spring Boot 在后台执行此操作,但 Gradle 可以自己执行此操作吗?我有一个非 Boot 应用,我希望能够以同样的方式管理它。
我希望它是一些生命周期钩子。 This question 很有帮助,但是如何执行 flyway 预构建?
【问题讨论】:
我发现每次运行 gradle build 时自动调用 Flyway's migrate command 非常有用。
Spring Boot 在后台执行此操作,但 Gradle 可以自己执行此操作吗?我有一个非 Boot 应用,我希望能够以同样的方式管理它。
我希望它是一些生命周期钩子。 This question 很有帮助,但是如何执行 flyway 预构建?
【问题讨论】:
是的,你可以。你有几个选择。您可以随时进入生命周期。默认情况下,java gradle 插件有几个地方可以挂钩。
$ ./gradlew clean build
:clean
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build
您可以附加到这些点中的任何一个
或者,如果您需要在其他任何事情之前应用,那么您可能需要考虑一个简单的插件。
以下是两者的示例:
build.gradle:
apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
testCompile 'junit:junit:4.12'
}
task runFlyAwayCommand << {
// process is type java.lang.Process
def process = "printf lifecycle hooked task".execute()
def processExitValue = process.waitFor()
def processOutput = process.text
project.logger.lifecycle("Flyaway{ exitValue: $processExitValue output: $processOutput }")
}
// compileJava could be any lifecycle task
tasks.findByName('compileJava').dependsOn tasks.findByName('runFlyAwayCommand')
// if you need to execute earlier you might want to create a plugin
apply plugin: SamplePlugin
class SamplePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
def process = "printf plugin apply".execute()
def processExitValue = process.waitFor()
def processOutput = process.text
project.logger.lifecycle("Flyaway{ exitValue: $processExitValue output: $processOutput }")
}
}
输出:
$ ./gradlew clean build
Configuration on demand is an incubating feature.
Flyaway{ exitValue: 1 output: plugin }
:clean
:runFlyAwayCommand
Flyaway{ exitValue: 1 output: lifecycle }
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1.294 secs
【讨论】: