我已经在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
移到了插件{{ 1}}。否则,请遵循 lu.koerfer 使用java
的解决方案。
答案 0 :(得分:1)
在您的插件中,您将创建一个新任务'sample'并设置一个约束“ sample必须在检查后运行”:但这在任务图中未包括sample任务。它只是说:“如果同时执行样本和检查任务,那么必须先执行检查任务”。因此,如果仅执行“ gradle build”,则不会触发任务“ 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
}
}
}
EDIT :为了避免依赖插件的应用顺序,可以将任务依赖项声明包装在“ afterEvaluate”块中:
void apply(Project project) {
// task 'sample' def ...
// ...
project.configure(project) {
project.afterEvaluate {
sample.mustRunAfter('check')
project.getTasks().findByName('build').dependsOn(sample)
}
}
答案 1 :(得分:1)
方法mustRunAfter
和shouldRunAfter
仅定义执行顺序,而非因果关系。这意味着它们不会导致任务被执行。但是如果这两个任务都执行,则将考虑指定的顺序。
要指定任务依赖性,请使用dependsOn
或finalizedBy
:
project.pluginManager.withPlugin('java') {
project.tasks.getByName('check').finalizedBy('sample');
}
这将导致sample
每次check
运行时都运行,并且确保它在check
之后运行。