впервые в 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
.
Любая помощь очень ценится.