gpt4 book ai didi

gradle - 如何将嵌套集合添加到扩展

转载 作者:行者123 更新时间:2023-12-03 05:24:20 26 4
gpt4 key购买 nike

Gradle的新手。我有这个简单的插件,带有扩展名,可让我编写自定义DSL:

import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

apply plugin: NeighborhoodPlugin

class Street {
String name
String type

public Street(name) {
this.name = name
}
}

class Neighborhood {
final NamedDomainObjectContainer<Street> streets
def name

public Neighborhood(streets) {
this.streets = streets
}

def streets(Closure closure) {
streets.configure(closure)
}
}

// Plugin
class NeighborhoodPlugin implements Plugin<Project> {
void apply(Project project) {
// Create the NamedDomainObjectContainers
def streets = project.container(Street);

//https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtensionAware.html
def neighborhoodExt = project.extensions.create( 'neighborhood', Neighborhood, streets )
}
}


neighborhood {
name = 'My neighborhood'
streets {
street1 {
type = 'T'
}
street2 {
type = 'round'
}
}
}

task show {
doLast {
println "${neighborhood.name} has ${neighborhood.streets.toArray().length} streets"
}
}

以上似乎有效。但是我想在DSL上进行扩展,以将 Houses添加到 Streets。像这样:
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

apply plugin: NeighborhoodPlugin

class House {
String name
String address

public House(name) {
this.name = name
}
}

class Street {
final NamedDomainObjectContainer<House> houses
String name
String type

public Street(name) {
this.name = name
}
}

class Neighborhood {
final NamedDomainObjectContainer<Street> streets
def name

public Neighborhood(streets) {
this.streets = streets
}

def streets(Closure closure) {
streets.configure(closure)
}
}

// Plugin
class NeighborhoodPlugin implements Plugin<Project> {
void apply(Project project) {
// Create the NamedDomainObjectContainers
def streets = project.container(Street);

//https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtensionAware.html
def neighborhoodExt = project.extensions.create( 'neighborhood', Neighborhood, streets )
}
}

neighborhood {
name = 'My neighborhood'
streets {
street1 {
type = 'T'
houses {
blueHouse {
address = '100 main'
}
}
}
street2 {
type = 'round'
}
}
}

task show {
doLast {
println "${neighborhood.name} has ${neighborhood.streets.toArray().length} streets"
}
}

我尝试过各种不同的组合,但是我永远无法完成。错误始终是: No signature of method: build_ch0yxyi3isqke8j97jxnsaw72.neighborhood() is applicable for argument types

任何帮助都非常感谢。

最佳答案

这可行,我从https://mrhaki.blogspot.com/2016/02/gradle-goodness-using-nested-domain.html获得它:

import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

apply plugin: NeighborhoodPlugin

class House {
String name
String address

public House(name) {
this.name = name
}
}

class Street {
NamedDomainObjectContainer<House> houses
String name
String type

public Street(name) {
this.name = name
}

def houses(Closure closure) {
houses.configure(closure)
}
}

class Neighborhood {
final NamedDomainObjectContainer<Street> streets
def name

public Neighborhood(streets) {
this.streets = streets
}

def streets(Closure closure) {
streets.configure(closure)
}
}

// Plugin
class NeighborhoodPlugin implements Plugin<Project> {
void apply(Project project) {

// Create the NamedDomainObjectContainers
def streets = project.container(Street);

streets.all {
houses = project.container(House)
}

//https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtensionAware.html
def neighborhoodExt = project.extensions.create( 'neighborhood', Neighborhood, streets )
}
}


neighborhood {
name = 'My neighborhood'
streets {
main {
type = 'Cul de-sac'
houses {
blueHouse {
address = '100 main'
}
pinkHouse {
address = '101 main'
}
greenHouse {
address = '103 main'
}
}
}
round {
type = 'Round'
houses {
yellowHouse {
address = '100 round'
}
greenHouse {
address = '101 round'
}
}
}
}
}

task show {
doLast {
println "${neighborhood.name} has ${neighborhood.streets.toArray().length} streets"
neighborhood.streets.all {
println "--> name: ${name}"
houses.all {
println "--> --> name: ${name} address: ${address}"
}
}
}
}

关于gradle - 如何将嵌套集合添加到扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62075845/

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