我在buildSrc
下的Groovy中编写了一个Gradle插件:
package test
import org.gradle.api.Plugin
import org.gradle.api.Project
class SamplePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println "This line prints" //Just for Configuration. This prints
def sample = project.tasks.create("sample") {
doLast {
println "This line does not print"
}
}
project.configure(project) {
sample.mustRunAfter('check')
}
}
}
在这里,我试图在我的sample
结束时运行build
任务,所以我让它在check
之后运行
我现在尝试在我的项目build.gradle
文件中调用它,看起来像:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
}
apply plugin: 'java'
apply plugin:'application'
apply plugin: test.SamplePlugin
repositories {
mavenLocal()
mavenCentral()
}
mainClassName = "test.Widget"
不幸的是,我没有看到它运行,即doLast
中的代码没有出现在输出中,但配置代码确实:
:buildSrc:compileJava NO-SOURCE
:buildSrc:compileGroovy
:buildSrc:processResources UP-TO-DATE
:buildSrc:classes
:buildSrc:jar
:buildSrc:assemble
:buildSrc:compileTestJava NO-SOURCE
:buildSrc:compileTestGroovy NO-SOURCE
:buildSrc:processTestResources NO-SOURCE
:buildSrc:testClasses UP-TO-DATE
:buildSrc:test NO-SOURCE
:buildSrc:check UP-TO-DATE
:buildSrc:build
This line prints
:compileJava UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:jar UP-TO-DATE
:startScripts UP-TO-DATE
:distTar UP-TO-DATE
:distZip UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava NO-SOURCE
:processTestResources NO-SOURCE
:testClasses UP-TO-DATE
:test NO-SOURCE
:check UP-TO-DATE
:build UP-TO-DATE
BUILD SUCCESSFUL in 1s
5 actionable tasks: 5 up-to-date
我会感激任何帮助或指示
编辑:由于M.Ricciuti评论下面的顺序问题,所以我在插件test.SamplePlugin
之后移动了java
。否则,请遵循使用pluginManager
的lu.koerfers解决方案。
在您的插件中,您正在创建一个新任务“样本”并设置一个约束“样本必须在检查后运行”:但这不包括任务图中的示例任务。它只是说:“如果样本和检查任务都被执行,那么必须先执行检查任务”。因此,如果您只执行'gradle build',这将不会触发任务“sample”的执行。
尝试直接执行“gradle sample”:您将看到它将触发其执行,并首先根据您在插件中定义的约束执行“检查”任务。
如果你想在每次执行“build”任务时执行“sample”任务,那么只需在你的插件中在“build”和“sample”任务之间设置一个“dependsOn”约束:
class SamplePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println "This line prints" //Just for Configuration. This prints
def sample = project.tasks.create("sample") {
doLast {
println "This line does not print"
}
}
project.configure(project) {
sample.mustRunAfter('check')
project.getTasks().findByName('build').dependsOn(sample) // <== set this contraint
}
}
}
编辑:为了避免不得不依赖插件应用顺序,任务依赖声明可以包含在“afterEvaluate”块中:
void apply(Project project) {
// task 'sample' def ...
// ...
project.configure(project) {
project.afterEvaluate {
sample.mustRunAfter('check')
project.getTasks().findByName('build').dependsOn(sample)
}
}
方法mustRunAfter
和shouldRunAfter
只定义执行顺序,而不是因果关系。这意味着它们不会导致任务被执行。但是如果两个任务都被执行,则会考虑指定的顺序。
要指定任务依赖关系,请使用dependsOn
或finalizedBy
:
project.pluginManager.withPlugin('java') {
project.tasks.getByName('check').finalizedBy('sample');
}
每次qazxsw poi运行时,这将导致qazxsw poi运行,并确保它在sample
之后运行。