gpt4 book ai didi

java - 使用 Java 定义 Gradle 插件属性扩展的正确方法?

转载 作者:行者123 更新时间:2023-12-02 01:03:31 33 4
gpt4 key购买 nike

我正在尝试在 Java 中创建一个具有属性扩展的 Gradle 插件(不是约定,因为这显然是 oldwrong 方式)。郑重声明,我正在 Linux 计算机 (Ubuntu 12.04) 上使用 Gradle 1.6。

我已经弄清楚这应该在插件类定义中完成。这是添加扩展的一种方法。创建一个包含您的属性的扩展类:

public class MyPluginExtensions {

File sourceDir;
File outputDir;

public MyPluginExtensions(Project project) {
this.project = project;
sourceDir = new File(project.getProjectDir(), "src");
outputDir = new File(project.getBuildDir(), "out");
}

}

现在将这些扩展添加到主插件类中的项目中:

public class MyPlugin implements Plugin<Project> {

@Override
public void apply(Project project) {

Map<String,Object> taskInfo = new HashMap<String,Object>();
taskInfo.put("type", MyPluginTask.class);
taskInfo.put("description", "Generates blah from blah.");
taskInfo.put("group", "Blah");
Task myPluginTask = project.task(taskInfo, "myPluginTask");

// Define conventions and attach them to tasks
MyPluginExtensions extensions = new MyPluginExtensions(project);
myPluginTask.getExtensions().add(
"sourceDir",
extensions.sourceDir);
myPluginTask.getExtensions().add(
"outputDir",
extensions.outputDir);
}
}

然而,这种方法似乎并不正确。新的项目属性显示在 project.ext 中命名空间。我希望能够将插件扩展解决为:

in my build.gradle:
myPluginTask.sourceDir = file('the/main/src')
myPluginTask.outputDir = file('the/output')

但是,当我将这些内容放入使用我的插件的 gradle 脚本中并尝试设置此属性时,gradle 告诉我无法设置它:

* What went wrong:
A problem occurred evaluating script.
> There's an extension registered with name 'sourceDir'. You should not reassign it via a property setter.

那么,在基于 Java 的 Gradle 插件中为任务添加属性扩展的正确方法是什么?

编辑:

根据其他一些 SO 帖子,我尝试一次性添加我的扩展对象:

// first attempt:
//myPluginTask.getExtensions().add("sourceDir", extensions.sourceDir);
//myPluginTask.getExtensions().add("outputDir",extensions.outputDir);

// second attempt
myPluginTask.getExtensions().add("myPluginTask", extensions);

这似乎有效。然而,Gradle 现在提示我添加了动态属性:

Deprecated dynamic property: "sourceDir" on "task ':myPluginTask'", value: "/Users/jfer...".

那么,添加插件扩展属性的正确方法是什么?

编辑2

因此,我再次尝试一下,将扩展添加到项目对象并使用 create 方法:

// first attempt:
//myPluginTask.getExtensions().add("sourceDir", extensions.sourceDir);
//myPluginTask.getExtensions().add("outputDir",extensions.outputDir);

// second attempt
// myPluginTask.getExtensions().add("myPluginTask", extensions);

// third attempt
project.getExtensions().create("myPluginTask", MyPluginExtensions.class, project);

但是,由于以下几个原因,此操作失败了:

  1. 创建与任务同名的属性扩展(“myPluginTask”)会导致任务名称和扩展名称之间发生冲突,导致任务从 gradle 的角度消失(并抛出倾斜错误,例如“没有这样的属性” : 依赖于类 ...MyPluginExtensions")。
  2. 如果我提供的名称不与任务名称冲突(例如“myPluginPropExt”),则 create() 方法可以工作,但不会按预期在其自己的命名空间中添加扩展(例如 project.myPluginPropExt.propertyName 和相反,将其添加到项目命名空间中(例如 project.propertyName ),这是不正确的,会导致 Gradle 抛出一堆“已弃用的动态属性”警告。

最佳答案

所以这是我的问题的解决方案:

public class MyPlugin implements Plugin<Project> {

@Override
public void apply(Project project) {

Map<String,Object> taskInfo = new HashMap<String,Object>();
taskInfo.put("type", MyPluginTask.class);
taskInfo.put("description", "Generates blah from blah.");
taskInfo.put("group", "Blah");
Task myPluginTask = project.task(taskInfo, "myPluginTask");

// Define conventions and attach them to tasks
MyPluginExtensions extensions = new MyPluginExtensions(project);

// the magic extension code:
project.getExtensions().add("myPluginName", extensions);
}
}

现在我可以在 gradle.build 文件中为其中一个扩展属性设置一个值,如下所示(并且我没有收到有关添加已弃用的动态属性的警告):

 myPluginName.sourceDir = file('the/main/src')

最后一个技巧是在我的插件任务中获取此值:

public class MyPluginTask extends DefaultTask {
@TaskAction
public void action() {
MyPluginExtensions extensions = (MyPluginExtensions) getProject()
.getExtensions().findByName("myPluginName");

System.out.println("sourceDir value: " + extensions.sourceDir);
}
}

这是可行的,但这个解决方案让我烦恼的是,我希望能够将扩展属性放在与任务相同的命名空间中(例如,myPluginTask.sourceDir),我已经看到了在基于 groovy 的插件中,但这显然不受支持或根本不起作用。

同时,希望这对其他人有帮助。

关于java - 使用 Java 定义 Gradle 插件属性扩展的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437273/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com