Gradle 渐变模型规则:如何创建/依赖模型范围内的任务
我试图使用“基于规则的模型配置”文档中描述的概念,但我很难找到一条路径来完成我需要的工作 我首先使用示例代码,但我需要能够为每个FileItem和/或DirectoryItem创建一个命名任务并将其依赖于某个位置 基本上我需要这样做:Gradle 渐变模型规则:如何创建/依赖模型范围内的任务,gradle,Gradle,我试图使用“基于规则的模型配置”文档中描述的概念,但我很难找到一条路径来完成我需要的工作 我首先使用示例代码,但我需要能够为每个FileItem和/或DirectoryItem创建一个命名任务并将其依赖于某个位置 基本上我需要这样做: @Managed interface Item extends Named {} @Managed interface FileItem extends Item {} @Managed interface DirectoryItem extends Item {
@Managed interface Item extends Named {}
@Managed interface FileItem extends Item {}
@Managed interface DirectoryItem extends Item {
ModelMap<Item> getChildren()
}
class PluginRules extends RuleSource {
@Rules void ApplyRulesForDirectory(DirectoryRules rules, @Each DirectoryItem directory) {}
}
apply plugin: PluginRules
abstract class DirectoryRules extends RuleSource {
@Mutate
void CreateTaskForFiles(ModelMap<Task> tasks, ModelMap<FileItem> children) {
children.each {
tasks.create(it.name, Task) {
// ...
}
}
}
}
model {
root(DirectoryItem) {
children {
dir(DirectoryItem) {
children {
file1(FileItem)
file2(FileItem)
}
}
file3(FileItem)
}
}
}
@托管接口项扩展名为{}
@托管接口FileItem扩展项{}
@托管接口目录项扩展项{
ModelMap getChildren()
}
类PluginRules扩展了RuleSource{
@规则无效ApplyRulesForDirectory(DirectoryRules规则,@Each DirectoryItem目录){}
}
应用插件:PluginRules
抽象类DirectoryRules扩展了RuleSource{
@变异
void CreateTaskForFiles(模型映射任务、模型映射子项){
每个孩子{
tasks.create(it.name,Task){
// ...
}
}
}
}
模型{
根目录(目录项){
孩子们{
目录(目录项){
孩子们{
文件1(文件项)
文件2(文件项)
}
}
文件3(文件项)
}
}
}
但是,在gradle 3.3中运行此功能失败:
The following model rules could not be applied due to unbound inputs and/or subjects:
DirectoryRules#CreateTaskForFiles(ModelMap<Task>, ModelMap<FileItem>)
subject:
- <no path> ModelMap<Task> (parameter 1) [*]
scope: root
inputs:
- <no path> ModelMap<FileItem> (parameter 2) [*]
[*] - indicates that a model item could not be found for the path or type.
由于未绑定的输入和/或主题,无法应用以下模型规则:
DirectoryRules#CreateTaskForFiles(ModelMap,ModelMap)
主题:
-模型映射(参数1)[*]
范围:根
投入:
-模型映射(参数2)[*]
[*]-表示找不到路径或类型的模型项。
有什么办法可以做到这一点吗
干杯,谢谢你的时间 就我对Gradle基于规则的模型所知有限,您的配置存在两个问题:
DirectoryRules
规则是随作用域应用的(即不作为插件应用于模型的根),因此需要为其提供所有需要访问的模型元素。您没有给它提供ModelMap任务
,因此这是第一个问题。一个可能的解决办法是:
class PluginRules extends RuleSource {
@Rules
void ApplyRulesForDirectory(DirectoryRules rules,
ModelMap<Task> tasks, @Each DirectoryItem directory) {}
}
就我对Gradle基于规则的模型所知有限,您的配置存在两个问题:
DirectoryRules
规则是随作用域应用的(即不作为插件应用于模型的根),因此需要为其提供所有需要访问的模型元素。您没有给它提供ModelMap任务
,因此这是第一个问题。一个可能的解决办法是:
class PluginRules extends RuleSource {
@Rules
void ApplyRulesForDirectory(DirectoryRules rules,
ModelMap<Task> tasks, @Each DirectoryItem directory) {}
}
啊,我明白了。我只需要从rood节点注入路径,并在子节点上进行相应的操作。我确实遇到了你们每个人都有模型输入的同一个问题。这看起来是一个可以接受的工作。啊,我明白了。我只需要从rood节点注入路径,并在子节点上进行相应的操作。我确实遇到了你们每个人都有模型输入的同一个问题。不过,这看起来是一个可以接受的解决方案。