2015-02-16 21 views
6

Tôi có một cái gì đó giống như plugin bên dưới, nơi tôi có một vùng tên bên ngoài và bên trong nó có một cá thể 'cụ thể' (mother) của một đối tượng cộng với một bộ sưu tập khác (children).Thêm đối tượng vào phần mở rộng plugin gradle

family { 
    mother { 
     firstname = 'John' 
     lastname = 'Cleese' 
    } 
    children { 
     son { 
     firstName = 'John' 
     lastName = 'Cleese' 
     } 
     daughter { 
     firstName = 'Jane' 
     lastName = 'Cleese' 
     } 
    } 
} 

Tôi có thể thêm đối tượng bộ sưu tập và đọc các biến dựa trên các ví dụ khác nhau mà tôi đã nhìn thấy nhưng không chắc chắn cách thêm ví dụ cụ thể.
Làm cách nào để xác định nó trên đối tượng tiện ích mở rộng?

Mã hiển thị sự cố - Tôi muốn thêm mother làm một phiên bản duy nhất với plugin.

import org.gradle.api.DefaultTask 
import org.gradle.api.tasks.TaskAction 
import org.gradle.api.NamedDomainObjectContainer 
import org.gradle.api.* 

class Person 
{ 
    final String name 
    String firstName 
    String lastName 
    Person(String name) { this.name = name } 
} 

class FamilyExtension { 

    final NamedDomainObjectContainer<Person> children 
    Person mother 
    Person father 

    FamilyExtension(children) { 
    this.children = children 
    } 

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

class FamilyPlugin implements Plugin<Project> { 

    void apply(Project project) { 
    project.task('sayHello', type: DefaultTask) << { 
     println(
     "Hello ${project.family.children["son"].firstName} " + 
     "and hello ${project.family.children["daughter"].firstName} ") 
    } 

    def children = project.container(Person) 

    project.extensions.create("family", FamilyExtension, children) 
    } 
} 
apply plugin: FamilyPlugin 

family { 
    // How do I add support for this? 
    // mother { 
    //  firstname = 'John' 
    //  lastname = 'Cleese' 
    // } 
    children { 
     son { 
     firstName = 'John' 
     lastName = 'Cleese' 
     } 
     daughter { 
     firstName = 'Jane' 
     lastName = 'Cleese' 
     } 
    } 
} 
+0

Không chắc chắn những gì bạn muốn đạt được. Thêm hỗ trợ cho việc thiết lập 'firstname' và' lastname' trên mẹ hoặc chỉ có trên người mẹ đơn thân? – Opal

+0

Tôi muốn thiết lập các giá trị tên trên người mẹ độc thân nhưng nói chung là muốn hiểu làm thế nào tôi có sự kết hợp của ObjectContainers và các đối tượng 'đơn giản' trong DSL. –

+0

Tôi cũng không tìm thấy bất kỳ dự án mẫu nào sử dụng cả hai dự án này hoặc cách đặt đối tượng trên tiện ích mở rộng không sử dụng cấu hình (đóng) –

Trả lời

0

Tôi đã có một vấn đề tương tự như bạn, nhưng tôi đã tìm ra cách để tạo ra các "mẹ" trên trường hợp của tôi, nhưng không phải là "trẻ em". Cách mà tôi thực hiện điều này là với một đối tượng mở rộng lồng nhau. Đây là cách tôi đã làm điều này (tôi là trong java tinh khiết, vì vậy bạn có thể cần phải thực hiện một số thay đổi để làm điều đó trong Groovy - Tôi rất mới để Groovy, vì vậy tôi không chắc chắn chính xác những gì cần phải được đã thay đổi):

Khi bạn thêm tiện ích trong plugin, lớp sẽ tự động hỗ trợ giao diện ExtensionAware và do đó có thể có tiện ích mở rộng được thêm vào. Trong hàm tạo FamilyExtension của bạn, hãy thêm một tiện ích mở rộng mới, trước tiên hãy đưa lớp này vào ExtensionAware:

public FamilyExtension(NamedDomainObjectContainer<Person> children) { 
    ((ExtensionAware) this).getExtensions().create("mother",Person.class); 
    this.children = children; 
} 

Điều này sẽ chỉ cho phép một người mẹ được khai báo chính xác như bạn có. Tuy nhiên, lưu ý rằng nó sẽ không thực thi chỉ một duy nhất, vì bạn có thể thêm bao nhiêu người mẹ như bạn muốn, nhưng bất kỳ khai báo sau này sẽ có kết quả của việc thay đổi giá trị trên cá thể đơn đó, vì vậy thực sự chỉ có một. Bạn cũng có thể nhận được một giá trị null nếu người mẹ không được tuyên bố, vì vậy sẽ phải thử nghiệm cho điều đó (một số bản demo nói rằng điều này có thể xảy ra, nhưng trong thí nghiệm của riêng tôi nó dường như không).

Để có được đối tượng mẹ của bạn, chỉ cần đúc phần mở rộng của bạn để ExtensionAware và lấy lớp Person khỏi đó như bạn sẽ nhận được phần mở rộng gia đình từ dự án

FamilyExtension fext = project.getExtensions().findByType(Person.class) 
Person mother = (Person) ((ExtensionAware) fext).getExtensions().findByName("mother") 

Edit: Một cách khác sẽ chỉ để xác định một hàm trên đối tượng mở rộng của bạn chấp nhận một đóng và có ủy nhiệm đóng đối với một đối tượng mẹ mới. Sau đó, bạn có thể sử dụng cờ Boolean để thực thi yêu cầu của chỉ một người mẹ.

private boolean mother_defined = false; 
private Person mother_value = null; // or Person mother = new Person() 

public void mother(Closure<?> motherdef) { 
    if (mother_defined) {throw new Exception("Only one mother allowed");} 
    mother_value = new Person(); 
    motherdef.setDelegate(mother); 
    motherdef.call(); 
    mother_defined = true; 
} 
0

Vâng, để thêm mother đóng cửa vào family bạn thêm đoạn mã sau vào lớp FamilyExtension

Person mother(Closure closure) { 
    mother = new Person() 
    project.configure(mother, closure) 
    return mother 
} 

Nếu, cùng một lúc bạn muốn có children mở rộng bên trong gia đình một bạn thêm mã sau vào phương thức FamilyPlugin.apply

project.extensions.create("family", FamilyExtension, instantiator, project) 
project.family.extensions.create("children", FamilyExtension.Children, project) 

Và sau đó bạn thêm

void son(Closure closure) { 
    Person son = new Person() 
    project.configure(son, closure) 
    children.add(son) 
} 

để có thể thêm son đóng cửa bên trong children một.

Để xem toàn bộ dự án và giải thích với biết thêm chi tiết vui lòng truy cập dự án Github https://github.com/andriipanasiuk/family-gradle-plugin

Các vấn đề liên quan