我正在尝试编写一个DSL,如下所示:
toolSetups {
someTool {
argsFile = file('run/some_tool/xrun_files.f')
}
someOtherTool {
argsFile = file('run/some_other_tool/xrun_files.f')
}
}
我通过向项目添加扩展来实现这一点,扩展是ToolSetup
条目的容器:
extensions.add('toolSetups', project.container(ToolSetup))
我按照用户指南中的示例在ToolSetup
中声明了argsFile
属性:
interface ToolSetup {
Property<File> getArgsFile()
}
我四处寻找,发现只有当ToolSetup
有name
属性时,这才有效。我将ToolSetup
修改为:
abstract class ToolSetup {
private final String name
public ToolSetup(String name) {
this.name = name
}
String getName() {
return name
}
abstract Property<File> getArgsFile()
}
我得到了以下信息:
无法为ToolSetup $Inject类型的对象设置只读属性"argsFile"的值。
我也试过显式调用argsFile.set(file(...))
,但这给了我同样的错误。我也试过使用ObjectFactory
显式创建Property
示例,但仍然得到同样的错误。
我已经编写了一个插件,它做了类似的事情,在哪里工作,但该插件是用Java编写的。我猜这里有一些小错误与Groovy有关,让Gradle为我管理实现,我没有看到。如果有人能指出这一点,我将非常感激。
以下是重现此问题的完整build.gradle
文件:
abstract class ToolSetup {
private final String name
public ToolSetup(String name) {
this.name = name
}
String getName() {
return name
}
abstract Property<File> getArgsFile()
}
extensions.add('toolSetups', project.container(ToolSetup))
toolSetups {
someTool {
argsFile = file('run/some_tool/xrun_files.f')
}
someOtherTool {
argsFile = file('run/some_other_tool/xrun_files.f')
}
}
1条答案
按热度按时间vql8enpb1#
我能让下面的工作
buildSrc/src/main/java/com/sample/Resource.java
build.gradle
输出产生