考虑以下构建管道:
15:21:50: Executing external task 'build'...
Hello from the GreetingPlugin
:compileKotlin UP-TO-DATE
:compileJava NO-SOURCE
:copyMainKotlinClasses UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:compileTestKotlin UP-TO-DATE
:compileTestJava NO-SOURCE
:copyTestKotlinClasses UP-TO-DATE
:processTestResources NO-SOURCE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
我需要编译一些位于以下位置的SaaS主题:
src/main/resources/VAADIN/themes/customtheme/customtheme.scss
在dir中的相应.css版本。
我认为我需要制作一些必须执行的gradle插件:
之间:jar和:bootRepackage以便我的.css最终在.jar中结束。
到目前为止,我有这个片段:
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: GreetingPlugin
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('hello') {
println "Hello from the GreetingPlugin"
}
}
}
但我们可以看到GreetingPlugin
似乎是先执行的。有没有办法可以插入我的插件来在构建管道中的特定点执行?例如,现有列出的插件如何知道它们必须执行的顺序?
答案 0 :(得分:1)
Gradle区分配置阶段和执行阶段。您的完整构建脚本在配置阶段中执行,并且在应用插件时会直接调用插件的apply
方法。在执行阶段 Gradle执行任务操作,doFirst
和doLast
关闭您列为命令行参数及其任务依赖关系的所有任务。
您的插件创建的任务hello
根本没有执行,只是配置了!在任务配置期间,输出将打印到命令行。要将println
命令移至执行阶段,请尝试以下代码:
project.task('hello') {
doFirst {
println "Hello from the GreetingPlugin"
}
}
这样,您就不会看到命令行输出,因为任务仍然无法执行。您可以通过使用gradle命令指定任务名称来执行它,例如gradle hello
或gradle build hello
。要将任务的执行绑定到另一个任务,您可以使用dependsOn
方法:
project.tasks['jar'].dependsOn('hello')
请注意,如果您的插件应用于不提供jar
任务的项目,则此方法将失败。在最终实现中,您应该尝试集成更多故障安全任务依赖项。