Cách tạo buildConfigField với kiểu String


145

Trong Android Studiodự án của tôi có hai build configurationvới một số buildConfigField:

    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à lỗi như sau:

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

việc tạo ra BuildConfig.javanhư 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;
}

Tôi nghĩ rằng APP_VERSIONSERVER_URLkhông được tạo đúng như kiểu String mà họ không có dấu ngoặc kép.

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


Chỉ cần thêm dấu ngoặc đơn xung quanh giá trị bằng dấu ngoặc kép: buildConfigField "String", APP_VERSION, ' "0.0.1" '(dĩ nhiên không có khoảng trắng)
Pierre

Câu trả lời:


254

Các trường cấu hình xây dựng kiểu chuỗi nê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 thoát bổ sung.


1
Câu hỏi 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ị thành một chuỗi bằng chữ. Do đó, câu trả lời của @ madhead đúng hơn (và đẹp hơn).
Will Vanderhoef

1
@WillVanderhoef, bạn sai hoàn toàn. Nó chỉ đơn giản là không hoạt động nếu bạn không đưa SERVER_URLvà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àError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Vladyslav Matviienko

Lỗi của tôi. 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), mà là về việc sử dụng dấu ngoặc kép để thoát giá trị biến: nếu chính biến đó không có dấu ngoặc kép, bạn có thể chỉ cần trích dẫn bên ngoài để thoát khỏi dấu gạch chéo ngược. Tôi đã chỉnh sửa cả hai câu trả lời.
madhead

@VladMatvienko chắc chắn hoạt động, tôi thực sự sử dụng nó theo cách tôi mô tả. def FIELD_NAME = "SERVER_URL"buildConfigField "boolean", FIELD_NAME, "false"làm việc tốt với nhau Nếu bạn thiếu định nghĩa của SERVER_URL, bạn sẽ gặp sự cố, đó có thể là điều bạn đang làm sai.
Will Vanderhoef

2
@WillVanderhoef, yeah, đó là những gì bạn quên đề cập - bạn sử dụng dấu ngoặc kép trong định nghĩa. Vì vậy, giải pháp của bạn có thêm 1 dòng và cũng sử dụng dấu ngoặc kép, và đó là lý do tại sao nó không tốt như của tôi.
Vladyslav Matviienko

95

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

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

5
Đó vẫn chưa phải là hướng đi, chúng ta không nên trốn thoát hoặc sử dụng các trích dẫn lồng nhau vì nó là Chuỗi
Fabio

4
@Fabio Sử dụng dấu ngoặc kép 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 .
Albert Vila Calvo

31

Nếu bằng cách "giải quyết các vấn đề", bạn có nghĩa là không phải trích dẫn hai chữ, tôi đã không bắt gặp bất cứ điều gì vì nó dường như đang hoạt động như thiết kế.

Tôi đã thử nghiệm chuyển các chữ thành " gradle.property " như một cách giải quyết, biến nhiều dòng xấu xí thành một dòng xấu xí.

Thích 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.properies

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

Suy nghĩ thêm:


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)}" }
...

tôi có một trường cấu hình xây dựng và tôi muốn truy cập vào biến đó trong myn def trong cùng một lớp .. tôi là người mới sử dụng plpp helpp !!
Adeel Turk

Cảm ơn kịch bản CONFIG! Trong nhóm, chúng tôi đã cải thiện một chút để ném ngoại lệ nếu var không tồn tại: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee

9

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

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

Nếu không, nó sẽ không thể.


Có thể nếu bạn sử dụng phép nội suy chuỗi, ví dụ: buildConfigField "String", "TEST", "\" $ {10} \ "" Bằng cách này bạn cũng có thể sử dụng các phương thức hoặc biến trong tệp xây dựng của mình.
Szorényi Ádám

9

Thoát dấu ngoặc kép của bạn:

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

5

Sử dụng

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

cho biến. Tham khảo từ đây


2

trong ứng dụng build.gradle

def buildTimeAndVersion = releaseTime() + "-" + getSvnVersion()    
buildTypes {
debug {
    signingConfig signingConfigs.config
    buildConfigField "String", 'BIULD_TIME', "\"${buildTimeAndVersion}\""
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
...
}

static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getDefault())
}

def getSvnVersion() {
def pro = ("svnversion -c " + getBuildDir().parent).execute()
pro.waitFor()
def version = pro.in.text
Pattern p = Pattern.compile("(\\d+\\:)?(\\d+)\\D?")
Matcher m = p.matcher(version)
if (m.find()) {
version = m.group(m.groupCount())
}
try {
return version
} catch (e) {
println e.getMessage()
}
return 0
}

sau đó trong BuildConfig

public final class BuildConfig {  
public static final boolean DEBUG = Boolean.parseBoolean("true");   
public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx";   
public static final String BUILD_TYPE = "debug";  
public static final String FLAVOR = "";  
public static final int VERSION_CODE = 53;  
public static final String VERSION_NAME = "5.4.4";  
// Fields from build type: debug  
public static final String BIULD_TIME = "20181030-2595";  
}

1
Mã chỉ có câu trả lời thực sự nản lòng. Để giúp độc giả tương lai, xin vui lòng giải thích những gì bạn đang làm quá!
itmysterybox

và lần sau tham khảo câu trả lời trước stackoverflow.com/a/53056170/1084764 thay vì chỉ sao chép dán
Raykud

0

Chỉ \ " my stuff\" làm việc cho tôi. Và tôi có tất cả các loại nhân vật kỳ lạ trong my stuff.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.