Come generare buildConfigField con tipo String


145

Nel mio Android Studioprogetto ce ne sono due build configurationcon alcuni 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'
    }
}

Ricevo ed errore come segue:

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

il generato BuildConfig.javaè il seguente:

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

Penso che APP_VERSIONe SERVER_URLnon vengano generati correttamente come tipo String non hanno virgolette.

Non sono sicuro del motivo per cui viene generato in questo modo. Per favore fatemi sapere come posso risolvere questo problema.


Basta aggiungere virgolette singole attorno al valore con virgolette doppie: buildConfigField "String", APP_VERSION, ' "0.0.1" '(senza spazi ovviamente)
Pierre,

Risposte:


254

I campi di configurazione build di tipo stringa devono essere dichiarati in questo modo:

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

il nome del campo tra virgolette, inoltre il valore del campo tra virgolette di escape.


1
La domanda intendeva utilizzare "SERVER_URL" come variabile. Mettere "SERVER_URL" tra virgolette rende il valore letterale String. La risposta di @ madhead è quindi più corretta (e più carina).
Will Vanderhoef,

1
@WillVanderhoef, ti sbagli completamente. Semplicemente non funziona se non si inseriscono le SERVER_URLvirgolette. Lo sapresti se lo provassi prima di commentare. Il messaggio di errore èError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Vladyslav Matviienko,

Colpa mia. Ho usato la risposta di Simas come base e l'ho appena copiata. Il mio punto non riguardava il terzo campo (nome della variabile), ma l'uso delle virgolette doppie per sfuggire al valore della variabile: se la variabile stessa non ha virgolette doppie, è possibile semplicemente virgolette esterne singole per sbarazzarsi di barre rovesciate. Ho modificato entrambe le risposte.
madhead,

@VladMatvienko funziona sicuramente, lo sto effettivamente usando come descrivo. def FIELD_NAME = "SERVER_URL"e buildConfigField "boolean", FIELD_NAME, "false"lavorare bene insieme. Se ti manca la definizione di SERVER_URL, andrai in crash, probabilmente è quello che stai facendo di sbagliato.
Will Vanderhoef,

2
@WillVanderhoef, sì, è quello che hai dimenticato di menzionare: usi le virgolette durante la definizione. Quindi la tua soluzione ha 1 riga extra e usa anche le virgolette, ed è per questo che non è buona come la mia.
Vladyslav Matviienko,

96

Perché tutti sono così arrabbiati di sfuggire alle doppie virgolette? Sembra brutto! Questo è Groovy, ragazzi, potete semplicemente mescolare virgolette singole e doppie:

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

5
Non è ancora la strada da percorrere, non dovremmo scappare o usare le virgolette nidificate poiché è String
Fabio

4
@Fabio L'utilizzo di virgolette nidificate consente di utilizzare espressioni che possono essere valutate. Vedere questa risposta .
Albert Vila Calvo,

31

Se "risolvendo i problemi" intendi non dover raddoppiare i valori letterali, non mi sono imbattuto in nulla come sembra funzionare come previsto.

Ho provato a spostare i letterali in " gradle.properties " come soluzione alternativa, trasformando potenzialmente più brutte linee in una brutta linea.

Così:

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.properties

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

Ulteriori pensieri:


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

ho un campo di configurazione build e voglio accedere a quella variabile in myn def nello stesso livello .. Sono nuovo a gradle plz helpp !!
Adeel Turk

Grazie per lo script CONFIG! In squadra lo abbiamo leggermente migliorato per generare un'eccezione se var non esiste: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee,

9

Anch'io ero confuso. Ma c'è un senso: "String" definisce il tipo di campo, mentre il valore del campo non viene quotato automaticamente per consentirci di utilizzare le espressioni qui:

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

Altrimenti, non sarebbe possibile.


È possibile se si utilizza l'interpolazione di stringhe, ad esempio: buildConfigField "String", "TEST", "\" $ {10} \ "" In questo modo è possibile utilizzare anche metodi o variabili nel file di build.
Szörényi Ádám,

9

Esci dalle virgolette:

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

5

Uso

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

per variabile. Riferimento da qui


2

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

quindi in 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
Le risposte solo al codice sono davvero scoraggiate. Per aiutare i futuri lettori, ti preghiamo di spiegare anche quello che stai facendo!
itsmysterybox

e la prossima volta fai riferimento alla tua risposta precedente stackoverflow.com/a/53056170/1084764 invece di
limitarti

0

Solo \ " my stuff\" ha funzionato per me. E ho tutti i tipi di personaggi strani dentro my stuff.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.