Gradle 渐变模型规则:如何创建/依赖模型范围内的任务

Gradle 渐变模型规则:如何创建/依赖模型范围内的任务,gradle,Gradle,我试图使用“基于规则的模型配置”文档中描述的概念,但我很难找到一条路径来完成我需要的工作 我首先使用示例代码,但我需要能够为每个FileItem和/或DirectoryItem创建一个命名任务并将其依赖于某个位置 基本上我需要这样做: @Managed interface Item extends Named {} @Managed interface FileItem extends Item {} @Managed interface DirectoryItem extends Item {

我试图使用“基于规则的模型配置”文档中描述的概念,但我很难找到一条路径来完成我需要的工作

我首先使用示例代码,但我需要能够为每个FileItem和/或DirectoryItem创建一个命名任务并将其依赖于某个位置

基本上我需要这样做:

@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节点注入路径,并在子节点上进行相应的操作。我确实遇到了你们每个人都有模型输入的同一个问题。不过,这看起来是一个可以接受的解决方案。