2015-10-26 14 views
7

Tôi đang làm việc trên một ứng dụng Android với Gradle làm hệ thống xây dựng của nó.Cách xác định và sử dụng hằng số trong tập lệnh tạo Gradle (Android)?

Mục tiêu của tôi là sử dụng một giá trị (tên gói) như là một applicationId:

productFlavors { 
    orange { 
     applicationId "com.fruits.android.orange" 
     // ... 

Nhưng cũng để lộ nó thông qua BuildConfig để mã Java có quyền truy cập vào nó.

Quyền truy cập này phải từ bên ngoài hương vị (cụ thể là phiên bản miễn phí của ứng dụng cần biết tên gói của phiên bản trả tiền để có thể nhắc người dùng nâng cấp trong cửa hàng Play).

Vì vậy, tôi muốn làm một cái gì đó như thế:

productFlavors { 
    orange { 
     applicationId orangeProPackage 
     // ... 


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ? 

Chỉ Tôi không chắc chắn làm thế nào để xác định orangeProPackage để nó có thể nhìn thấy trong toàn bộ build.gradle và không phá vỡ kịch bản.

Kể từ khi có một vài hương vị khác nhau, nó sẽ là tốt nhất nếu tôi có thể bằng cách nào đó nhóm tất cả các hằng số như vậy (tôi đoán?):

def proPackages = [ 
     orange: "..." 
     apple: "..." 
     banana: "..." 
] 

và sau đó giới thiệu cho họ một cách sạch sẽ và mô tả như proPackages.orange v.v.

Câu hỏi đặt ra là, cách thực hiện điều đó?

Đây không phải là bản sao của Is it possible to declare a variable in Gradle usable in Java?

I have seen that câu hỏi (và một vài người khác). Tôi biết cách khai báo buildConfigFields, tôi đã có rất nhiều thứ. Câu hỏi của tôi là về việc sử dụng lại giá trị giống như buildConfigFieldapplicationId.

+0

Bản sao có thể có của [Có thể khai báo biến trong Gradle có thể sử dụng được trong Java không?] (Http://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in- gradle-usable-in-java) – ThomasThiebaud

+0

@Maloubobola nó không phải là một bản sao.Tôi đã nhìn thấy câu hỏi đó (và một vài câu hỏi khác). Tôi biết cách khai báo buildConfigFields, tôi đã có rất nhiều thứ. Câu hỏi của tôi là về * tái sử dụng * cùng giá trị với 'buildConfigField' * và *' applicationId'. –

Trả lời

15

Chỉ tôi không chắc chắn cách xác định orangeProPackage để nó hiển thị trong toàn bộ build.gradle và không phá vỡ tập lệnh.

Bạn có thể đặt nó trong gradle.properties trong thư mục gốc của dự án. Giống như .properties file khác, nó chỉ là một cửa hàng giá trị khóa:

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp 

Sau đó bạn đề cập đến nó như là một biến đơn giản toàn cầu chuỗi (ORANGE_PRO_PACKAGE) trong build.gradle của bạn:

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE 

nó sẽ là tốt nhất nếu tôi bằng cách nào đó có thể nhóm tất cả các hằng số này

Bất kỳ thứ gì liên quan đến .properties sẽ không được xử lý e đó. Ở đó, bạn có thể xem xét định nghĩa các hình cầu trong tệp build.gradle cấp cao nhất chỉ trong mã Groovy thuần túy hoặc một cái gì đó.

+4

Thực ra nó phải là 'buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"'' hoặc giá trị khác không được tạo ra dưới dạng chuỗi ký tự trong BuildConfig và dấu ngắt xây dựng. Nhưng khác hơn thế - nó hoạt động, cảm ơn cho tip. –

+0

Có thể sử dụng một tệp '.properties' khác cho mỗi hương vị không? Một lợi thế sẽ là cách này người ta có thể giữ lại cùng một khóa (trong gradle.properties) trên các hương vị. Dựa trên hương vị vì tệp sẽ thay đổi, giá trị của các khóa đó sẽ khác nhau. Nếu sử dụng cùng một tệp 'gradle.properties' cho một chuỗi có giá trị thay đổi dựa trên hương vị, chúng ta sẽ cần phải có các khóa khác nhau trong cùng một tệp' .properties', điều này khó duy trì theo thời gian hơn. –

+1

@ShobhitPuri: "Có thể sử dụng tệp .properties khác cho mỗi hương vị không?" - không có gì tự động cho AFAIK đó. Nhưng Gradle là Groovy, vì vậy bạn có thể đọc bất kỳ tệp nào từ máy phát triển mà bạn muốn trong các kịch bản xây dựng của mình. – CommonsWare

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