2015-06-12 17 views
60

Trong dự án Android Studio tôi có hai build configuration với một số buildConfigField:Làm thế nào để tạo ra buildConfigField với String loại

buildTypes { 
    def SERVER_URL = "SERVER_URL" 
    def APP_VERSION = "APP_VERSION" 

    debug { 
     buildConfigField "String", SERVER_URL, "http://dev.myserver.com" 
     buildConfigField "String", APP_VERSION, "0.0.1" 
    } 

    release { 
     buildConfigField "String", SERVER_URL, "https://myserver.com" 
     buildConfigField "String", APP_VERSION, "0.0.1" 

     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 

Tôi nhận được và báo lỗi như sau:

/path/to/generated/BuildConfig.java 
    Error:(14, 47) error: ';' expected 
    Error:(15, 47) error: ';' expected 

các BuildCofig.java tạo ra được như sau:

public final class BuildConfig { 
    public static final boolean DEBUG = Boolean.parseBoolean("true"); 
    public static final String APPLICATION_ID = "com.mycuteoffice.mcoapp"; 
    public static final String BUILD_TYPE = "debug"; 
    public static final String FLAVOR = ""; 
    public static final int VERSION_CODE = 1; 
    public static final String VERSION_NAME = "1.0"; 
    // Fields from build type: debug 
    public static final String APP_VERSION = 0.0.1; 
    public static final String SERVER_URL = http://dev.mycuteoffice.com; 
} 

I th mực APP_VERSIONSERVER_URL không được tạo đúng cách vì là loại Chuỗi chúng không có dấu ngoặc kép.

Tôi không chắc chắn lý do tại sao nó được tạo theo cách như vậy. Vui lòng cho tôi biết cách tôi có thể giải quyết vấn đề này.

Trả lời

110

String loại lĩnh vực xây dựng cấu hình cần được khai báo như thế này:

buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\"" 

tên trường trong dấu ngoặc kép, giá trị trường trong dấu ngoặc kép được nhân đôi thêm.

+1

Câu hỏi được dự định sử dụng 'SERVER_URL' làm biến. Đặt "SERVER_URL" trong dấu ngoặc kép làm cho giá trị là Chuỗi theo nghĩa đen. Câu trả lời của @ madhead là do đó chính xác hơn (và đẹp hơn). –

+1

@WillVanderhoef, bạn hoàn toàn sai. Nó chỉ đơn giản là không hoạt động nếu bạn không đặt 'SERVER_URL' vào dấu ngoặc kép. Bạn sẽ biết nó nếu bạn đã thử nó trước khi bình luận. Thông báo lỗi là 'Lỗi: (32, 0) Không thể tìm thấy thuộc tính 'SERVER_URL' trên BuildType _...' –

+0

. Tôi đã sử dụng câu trả lời của Simas làm cơ sở và chỉ sao chép nó. Quan điểm của tôi không phải là về trường thứ ba (tên biến), nhưng về việc sử dụng dấu ngoặc kép để thoát giá trị biến: nếu biến không có dấu ngoặc kép, bạn có thể chỉ đơn giản là dấu ngoặc kép bên ngoài để loại bỏ dấu gạch chéo ngược. Tôi đã chỉnh sửa cả hai câu trả lời. – madhead

8

thoát dấu ngoặc kép chuỗi của bạn:

buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\"" 
buildConfigField "String", 'APP_VERSION', "\"0.0.1\"" 
50

Tại sao tất cả mọi người là rất điên về thoát dấu ngoặc kép? Trông xấu xí! Đây là Groovy, các bạn, bạn chỉ có thể trộn các dấu nháy đơn và kép:

buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"' 
buildConfigField "String", 'APP_VERSION', '"0.0.1"' 
+3

Đó vẫn chưa phải là cách để đi, chúng ta không cần phải trốn thoát hoặc sử dụng dấu ngoặc kép vì nó là String – Fabio

+1

@Fabio. cho phép sử dụng các biểu thức có thể được đánh giá. Xem [câu trả lời này] (http://stackoverflow.com/a/38290751/4034572). –

7

Tôi cũng bối rối. Nhưng có một ý nghĩa - "String" xác định loại trường, trong khi giá trị trường không được trích dẫn tự động để cho phép chúng ta sử dụng biểu thức ở đây:

buildConfigField "String", "TEST", "new Integer(10).toString()"

Nếu không, nó sẽ không được khả thi.

11

Nếu bằng cách "giải quyết các vấn đề" có nghĩa là bạn không cần phải tăng gấp đôi literals báo giá, tôi đã không đi qua bất cứ điều gì vì nó dường như được làm việc như thiết kế.

Tôi đã thử nghiệm di chuyển các chữ vào "gradle.properties" là giải pháp thay thế, chuyển nhiều dòng xấu xí thành một dòng xấu xí.

Giống như vậy:

buildTypes { 
def SERVER_URL = "SERVER_URL" 
def APP_VERSION = "APP_VERSION" 

def CONFIG = { k -> "\"${project.properties.get(k)}\"" } 

debug { 
    buildConfigField "String", SERVER_URL, CONFIG("debug.server.url") 
    buildConfigField "String", APP_VERSION, CONFIG("version") 
} 

release { 
    buildConfigField "String", SERVER_URL, CONFIG("release.server.url") 
    buildConfigField "String", APP_VERSION, CONFIG("version") 

    minifyEnabled false 
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
} 
} 

gradle.tính

version=0.1.1 
... 
debug.server.url=http://dev.myserver.com 
... 
release.server.url=http://myserver.com 
... 

suy nghĩ sâu hơn:


def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" } 
def CONFIG_DEBUG = { k -> CONFIG('debug',k) } 
def CONFIG_RELEASE = { k -> CONFIG('release',k) } 

def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" } 
def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" } 
... 
+0

Chắc chắn là vậy. :) –

+0

tôi có một trường cấu hình xây dựng và tôi muốn truy cập biến đó trong myn def trong cùng một gradle .. i am new gradle plz helpp !! –

0

Sử dụng

buildConfigField "String", "FILE_NAME", "\"{$fileName}\"" 

cho biến. Tham chiếu từ here

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