gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 04:29:14 26 4
gpt4 key购买 nike

我正在尝试使用“基于规则的模型配置”文档中描述的概念,但是我很难找到执行所需操作的路径。

我使用的是ruleSourcePluginEach示例代码,但是我需要能够为每个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)
}
}
}

但是,在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.

任何想法如何实现这一目标?

干杯,感谢您的宝贵时间!

最佳答案

就我对Gradle基于规则的模型的有限了解所知,您的配置存在两个问题:

  • 由于DirectoryRules规则适用于范围(即未作为插件应用于模型的根目录),因此您需要为其提供所有需要访问的模型元素。您没有给它ModelMap<Task> tasks,所以这是第一个问题。可能的解决方案是:
    class PluginRules extends RuleSource {
    @Rules
    void ApplyRulesForDirectory(DirectoryRules rules,
    ModelMap<Task> tasks, @Each DirectoryItem directory) {}
    }

    但是,这揭示了第二个问题...
  • 看起来Gradle的@Each批注只能在规则的目标(即被修改的事物)上使用,而您试图在规则的输入之一(目标是ModelMap<Task> tasks)上使用它。我不知道为什么这个限制适用于@Each;大概与何时/如何检测到匹配的模型对象有关。

  • 在不确切了解您要实现的目标的情况下,很难提出理想的或惯用的解决方案。然而,天真的,这似乎可行:
    @Managed interface Item extends Named {}
    @Managed interface FileItem extends Item {}
    @Managed interface DirectoryItem extends Item {
    ModelMap<Item> getChildren()
    }

    class PluginRules extends RuleSource {
    @Mutate
    void CreateTasksForFiles(ModelMap<Task> tasks, @Path("root") DirectoryItem directory) {
    directory.children.withType(FileItem).each {
    tasks.create(it.name, Task) {
    // ...
    }
    }
    directory.children.withType(DirectoryItem).each {
    ApplyRulesForDirectory(tasks, it)
    }
    }
    }
    apply plugin: PluginRules

    model {
    root(DirectoryItem) {
    children {
    dir(DirectoryItem) {
    children {
    file1(FileItem)
    file2(FileItem)
    }
    }
    file3(FileItem)
    }
    }
    }

    关于gradle - Gradle模型规则:如何创建/依赖模型范围内的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41840893/

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