Cara menghasilkan buildConfigField dengan tipe String

145

Di saya Android Studio proyek ada dua build configurationdengan beberapa 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'
    }
}

Saya menerima kesalahan sebagai berikut:

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

yang dihasilkan BuildConfig.java adalah sebagai berikut:

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;
}

Saya pikir APP_VERSIONdan SERVER_URLtidak dihasilkan dengan benar sebagai tipe String mereka tidak memiliki tanda kutip.

Saya tidak yakin mengapa ini dibuat sedemikian rupa. Tolong beri tahu saya cara mengatasi masalah ini.

Abdullah
sumber
Tambahkan saja tanda kutip tunggal di sekitar nilai dengan tanda kutip ganda: buildConfigField "String", APP_VERSION, ' "0.0.1" '(tanpa spasi tentu saja)
Pierre

Jawaban:

254

Kolom tipe build build config harus dinyatakan seperti ini:

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

nama bidang dalam tanda kutip, nilai bidang dalam tanda kutip juga ditambahkan.

Vladyslav Matviienko
sumber
1
Pertanyaan yang dimaksudkan untuk menggunakan 'SERVER_URL' sebagai variabel. Menempatkan "SERVER_URL" dalam tanda kutip membuat nilai menjadi String literal. Oleh karena itu, jawaban madhead lebih benar (dan lebih cantik).
Will Vanderhoef
1
@ WillVanderhoef, Anda benar-benar salah. Ini sama sekali tidak berfungsi jika Anda tidak SERVER_URLmengutip. Anda akan tahu jika Anda mencobanya sendiri sebelum berkomentar. Pesan kesalahannya adalahError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Vladyslav Matviienko
Salahku. Saya menggunakan jawaban Simas sebagai basis dan hanya menyalinnya. Maksud saya bukan tentang bidang ketiga (nama variabel), tetapi tentang menggunakan tanda kutip ganda untuk keluar dari nilai variabel: jika variabel itu sendiri tidak memiliki tanda kutip ganda, Anda dapat dengan mudah tanda kutip luar untuk menghilangkan garis miring terbalik. Saya telah mengedit kedua jawaban.
madhead
@VladMatvienko pasti berfungsi, saya benar-benar menggunakannya seperti yang saya jelaskan. def FIELD_NAME = "SERVER_URL"dan buildConfigField "boolean", FIELD_NAME, "false"bekerja dengan baik bersama. Jika Anda kehilangan definisi SERVER_URL yang akan macet, mungkin itu yang Anda lakukan salah.
Will Vanderhoef
2
@ WillVanderhoef, ya, itulah yang Anda lupa sebutkan - Anda menggunakan tanda kutip selama definisi. Jadi solusi Anda memiliki 1 baris tambahan, dan menggunakan tanda kutip juga, dan itu sebabnya tidak sebaik saya.
Vladyslav Matviienko
96

Mengapa semua orang sangat marah karena lolos dari tanda kutip ganda? Tampak jelek! Ini Groovy, teman-teman, Anda bisa mencampur tanda kutip tunggal dan ganda:

buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
orang gila
sumber
5
Itu masih bukan cara untuk pergi, kita tidak harus melarikan diri atau menggunakan kutipan bersarang karena itu String
Fabio
4
@Fabio Menggunakan kutipan bersarang memungkinkan menggunakan ekspresi yang dapat dievaluasi. Lihat jawaban ini .
Albert Vila Calvo
31

Jika dengan "menyelesaikan masalah" yang Anda maksud tidak harus melipatgandakan kutipan literal, saya belum menemukan apa pun karena tampaknya berfungsi sebagaimana dirancang.

Saya telah bereksperimen dengan memindahkan literal ke " gradle.properties " sebagai solusi, mengubah beberapa garis yang berpotensi jelek menjadi satu garis yang jelek.

Seperti itu:

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'
}
}

properti

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

Pikiran lebih lanjut:


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)}" }
...
Primexx
sumber
Saya memiliki bidang config build dan saya ingin mengakses variabel di myn def di gradle yang sama .. saya baru untuk gradle plz helpp !!
Adeel Turk
Terima kasih untuk skrip CONFIG! Di tim kami sedikit meningkatkannya untuk melempar pengecualian jika var tidak ada: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee
9

Saya juga bingung. Tetapi ada arti - "String" mendefinisikan jenis bidang, sedangkan nilai bidang tidak dikutip secara otomatis untuk memungkinkan kami menggunakan ekspresi di sini:

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

Kalau tidak, itu tidak mungkin.

Geiger
sumber
Mungkin jika Anda menggunakan interpolasi string, misalnya: buildConfigField "String", "TEST", "\" $ {10} \ "" Dengan cara ini Anda juga dapat menggunakan metode atau variabel dalam file build Anda.
Szörényi Ádám
9

Lepaskan kutipan string Anda:

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

Menggunakan

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

untuk variabel. Referensi dari sini

Audi
sumber
2

di app 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
}

lalu di 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";  
}
yitai wei
sumber
1
Kode hanya jawaban yang benar-benar tidak disarankan. Untuk membantu pembaca masa depan, tolong jelaskan apa yang Anda lakukan juga!
itsmysterybox
dan referensi waktu berikutnya untuk jawaban Anda sebelumnya stackoverflow.com/a/53056170/1084764 alih-alih menyalin salin
Raykud
0

Hanya \ " my stuff\" yang bekerja untuk saya. Dan saya memiliki semua jenis karakter aneh my stuff.

Sevastyan Savanyuk
sumber