自定义 Gradle 插件在多项目构建中只执行一次
Custom Gradle Plugin executed only once in Multiproject build
我在 Java 中编写了一个 gradle 插件,我想在多项目 gradle 设置中使用它。插件自带的任务只执行一次,不明白为什么。
项目的结构如下所示:
Root project
|- settings.gradle
|- build.gradle
|- project1
| |- build.gradle
|- project2
| |- build.gradle
|- project3
| |- build.gradle
...
根 build.gradle 看起来像这样
buildscript {
repositories {
jcenter()
maven { url "https://repo.spring.io/plugins-snapshot" }
maven { url "https://repo.spring.io/plugins-release" }
maven{
url = "https://my-personal-nexus.de/content/repositories/release/"
}
....
dependencies {
....
classpath "de.mystuff:myCustomPlugin:1.0.0"
}
}
}
subprojects {
apply plugin: "myCustomPlugin"
....
}
插件 "myCustomPlugin" 提供了一个名为 myTask 的任务。由于插件应用于 build.gradle 的子项目部分,我假设当我调用时:
./gradlew myTask
将为项目 1、项目 2、项目 3 执行任务。
实际上该任务只在project1 中执行,而不在project2 或project3 中执行。如果我打电话
./gradlew -p "project2" myTask
任务在项目2中执行得很好。
关于为什么不为每个子项目执行任务的任何提示?
当我打电话时
./gradlew tasks --all
结果显示每个子项目的任务。
谢谢!
编辑:
任务插件代码:
public class MyGeneratorTask extends DefaultTask {
@TaskAction
public void genMyCode() throws Exception {
MyGeneratorExtension extension = getProject().getExtensions().getByType(MyGeneratorExtension.class);
MyGeneratorConfig.setPath(extension.getPath());
MyGeneratorConfig.setGendir(extension.getGendir());
MyCodeGeneratorApplication.generateMyClasses();
}
}
以及插件定义本身:
public class MyPlugin implements Plugin<Project> {
static final String GEN_TASK_CONFIG = "myConfig";
static final String GEN_TASK_NAME = "myTask";
@Override
public void apply(Project target) {
target.getExtensions().add(GEN_TASK_CONFIG, MyGeneratorExtension.class);
target.getTasks().create(GEN_TASK_NAME, MyGeneratorTask.class);
}
}
以及分机代码:
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class MyGeneratorExtension {
private String path;
private String gendir;
}
解决方案:
gradle 似乎不喜欢在任务中调用静态方法。
在我切换到 class-初始化后它起作用了。
谢谢@M.Ricciuti
我在 Java 中编写了一个 gradle 插件,我想在多项目 gradle 设置中使用它。插件自带的任务只执行一次,不明白为什么。
项目的结构如下所示:
Root project
|- settings.gradle
|- build.gradle
|- project1
| |- build.gradle
|- project2
| |- build.gradle
|- project3
| |- build.gradle
...
根 build.gradle 看起来像这样
buildscript {
repositories {
jcenter()
maven { url "https://repo.spring.io/plugins-snapshot" }
maven { url "https://repo.spring.io/plugins-release" }
maven{
url = "https://my-personal-nexus.de/content/repositories/release/"
}
....
dependencies {
....
classpath "de.mystuff:myCustomPlugin:1.0.0"
}
}
}
subprojects {
apply plugin: "myCustomPlugin"
....
}
插件 "myCustomPlugin" 提供了一个名为 myTask 的任务。由于插件应用于 build.gradle 的子项目部分,我假设当我调用时:
./gradlew myTask
将为项目 1、项目 2、项目 3 执行任务。
实际上该任务只在project1 中执行,而不在project2 或project3 中执行。如果我打电话
./gradlew -p "project2" myTask
任务在项目2中执行得很好。 关于为什么不为每个子项目执行任务的任何提示?
当我打电话时
./gradlew tasks --all
结果显示每个子项目的任务。
谢谢!
编辑:
任务插件代码:
public class MyGeneratorTask extends DefaultTask {
@TaskAction
public void genMyCode() throws Exception {
MyGeneratorExtension extension = getProject().getExtensions().getByType(MyGeneratorExtension.class);
MyGeneratorConfig.setPath(extension.getPath());
MyGeneratorConfig.setGendir(extension.getGendir());
MyCodeGeneratorApplication.generateMyClasses();
}
}
以及插件定义本身:
public class MyPlugin implements Plugin<Project> {
static final String GEN_TASK_CONFIG = "myConfig";
static final String GEN_TASK_NAME = "myTask";
@Override
public void apply(Project target) {
target.getExtensions().add(GEN_TASK_CONFIG, MyGeneratorExtension.class);
target.getTasks().create(GEN_TASK_NAME, MyGeneratorTask.class);
}
}
以及分机代码:
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class MyGeneratorExtension {
private String path;
private String gendir;
}
解决方案:
gradle 似乎不喜欢在任务中调用静态方法。 在我切换到 class-初始化后它起作用了。
谢谢@M.Ricciuti