2011-10-10 58 views
10

Rõ ràng là tôi không hiểu những gì đang xảy ra ở đây.Cố gắng hiểu các thuộc tính của dự án gradle

Tôi đoán không thể truy cập prop2 và prop3 vì chúng là các biến thay vì "thuộc tính dự án".

Câu hỏi nảy sinh vì tôi muốn các biến prop2 và prop3 hiển thị từ bên trong phương thức "doTheThing()", nhưng tôi không muốn chuyển chúng vào. Tôi muốn các biến có thể truy cập toàn cầu cho các nhiệm vụ, phương thức và các lớp (nhưng chỉ từ bên trong bản thân kịch bản xây dựng) - và tôi muốn chúng được gõ (đó là lý do tại sao không thể chấp nhận sự không rõ ràng của prop1).

Thực sự, mặc dù - tôi đoán những gì tôi yêu cầu là một số trợ giúp tìm hiểu xem thuộc tính dự án Gradle là gì và cú pháp 'prop1 =' blah '' thực sự đang làm gì.

Tôi đã đọc hướng dẫn sử dụng Gradle và Gradle in Action - nếu họ đã giải thích khái niệm này, hãy chỉ cho tôi đến phần bên phải (có thể tôi đã đọc qua phần đó tại thời điểm không hiểu điều gì đang nói).

prop1 = "blah" 
String prop2 = "bleah" 
def prop3 = "blargh" 

task testPropAccess << { 
    println "1: $prop1" 
    println "2: $prop2" 
    println "3: $prop3" 
    doTheThing() 
} 

private void doTheThing(){ 
    println "4: $prop1" 
    println "5: $prop2" // error: Could not find property 'prop2' on root project 'script' 
    println "6: $prop3" // error: Could not find property 'prop3' on root project 'script' 
} 
+0

Điều này cũng sẽ giúp: http://groovy.codehaus.org/Scoping+and+the+Semantics+of+%22def%22 – rodion

+0

@Rodion - liên kết đó khá hữu ích, cảm ơn. Đoán tôi cần làm một số nghiên cứu định hướng Groovy hơn. – Shorn

+0

Đối với bất kỳ ai muốn làm tương tự, cách giải quyết hiện tại của tôi để nhận chức năng tôi muốn là xác định thuộc tính mở rộng tập lệnh của tôi trong một lớp như sau: 'lớp StaticProps { Chuỗi tĩnh prop4 = System.getProperty (" prop4 " "wibble") } ' Và sau đó sử dụng chúng như thế này: 'System.getProperty ("prop4", StaticProps.prop4)' – Shorn

Trả lời

19

Khi bạn khai báo một biến ở cấp ngoài cùng (như trong tuyên bố thứ hai và thứ ba của bạn), nó trở thành một biến cục bộ của phương pháp của kịch bản run. Đây thực sự chỉ là hành vi Groovy, và không có gì Gradle có thể dễ dàng thay đổi.

Nếu bạn muốn tương đương với biến toàn cầu, chỉ cần gán một giá trị cho một biến không liên kết (như trong câu lệnh đầu tiên của bạn). Điều này thêm một thuộc tính động vào đối tượng Project của Gradle, được hiển thị trong toàn bộ kịch bản lệnh xây dựng (trừ khi bị che khuất). Nói cách khác, prop1 = "blah" tương đương với project.prop1 = "blah".

Nếu bạn muốn tương đương với biến toàn cục đã nhập, bạn sẽ phải đợi cho đến khi Gradle nâng cấp lên Groovy 1.8, điều này có thể thực hiện được với chú thích @Field. Hoặc bạn viết một plugin kết hợp một đối tượng quy ước vào đối tượng Project (nhưng điều đó không phù hợp cho việc tạo mã đặc biệt).

+16

Đối với bất cứ ai mà tình cờ gặp phải điều này, bây giờ nó được khuyến khích rằng khi làm những gì Peter đề nghị bạn thay vì viết 'ext.prop1 =" blah "'. Kỹ thuật cũ hơn vẫn hoạt động nhưng bị phản đối và tạo ra cảnh báo. Sử dụng ext chỉ là một cách hay để nói rõ rằng bạn định tạo một thuộc tính mới. Nếu bạn nghĩ rằng bạn đang sử dụng một tài sản hiện có và đang vô tình tạo ra một sản phẩm mới, nó có thể gây thất vọng khủng khiếp, vì vậy đây có lẽ là một thay đổi khá tốt. –

+0

Xin chào Peter lần nữa. Câu hỏi nhanh, tôi đã tạo một biến 'ext.blah = 'foobar'' ở tệp build.gradle ở mức cao nhất nhưng nó không nằm trong phạm vi' buildscript', bất kỳ ý tưởng nào tại sao? – Bob

+0

Đó phải là một câu hỏi riêng biệt (nếu nó chưa tồn tại). –

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