Gradle Goodness: Create Objects Using DSL With Domain Object Containers
来自: https://dzone.com/articles/gradle-goodness-create-objects-using-dsl-with-doma
Gradle offers the NamedDomainObjectContainer class to create a collection of objects defined using a clean DSL. The only requirement for the objects we want to create is that they have a constructor that takes a String argument and a name property to identify the object. The value for the name property must be unique within the collection of objects. We create a new instance of a NamedDomainObjectContainer with the container method of the Gradle Project class. We can add the NamedDomainObjectContainer instance to the extensions property of our project , so we can use a DSL to create instances of objects that need to be in the NamedDomainObjectContainer object in our project.
The following code shows a simple build script in which we want to create a collection of Product objects. The creation of the NamedDomainObjectContainer object is done in a plugin so we only have to apply the plugin to use the DSL to create Product objects:
apply plugin: ProductsPlugin // DSL to define new objects of type Product. products { // Create Product with name pencil. pencil { price = 0.05 } // Create Product with name crayon. crayon { price = 0.18 } } class ProductsPlugin implements Plugin<Project> { void apply(final Project project) { // Create NamedDomainObjectContainer instance for // a collection of Product objects NamedDomainObjectContainer<Product> productContainer = project.container(Product) // Add the container instance to our project // with the name products. project.extensions.add('products', productContainer) // Simple task to show the Product objects // that are created by Gradle using // the DSL syntax in our build file. project.task('reportProducts') << { def products = project.extensions.getByName('products') products.all { // A Product instance is the delegate // for this closure. println "$name costs $price" } } } } class Product { // We need a name property // so the object can be created // by Gradle using a DSL. String name BigDecimal price Product(final String name) { this.name = name } }
We can run the reportProducts task to see the name and price properties of the Product instances:
$ gradle -q reportProducts crayon costs 0.18 pencil costs 0.05 $
Written with Gradle 2.11.