So generieren Sie buildConfigField mit dem Typ String

145

In meinem Android StudioProjekt gibt es zwei build configurationmit einigen 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'
    }
}

Ich bekomme und Fehler wie folgt:

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

Das erzeugte BuildConfig.javaist wie folgt:

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

Ich denke, die APP_VERSIONund SERVER_URLwerden nicht richtig generiert, da sie als String-Typ keine Anführungszeichen haben.

Ich bin mir nicht sicher, warum es so erzeugt wird. Bitte lassen Sie mich wissen, wie ich dieses Problem beheben kann.

Abdullah
quelle
Fügen Sie einfach einfache Anführungszeichen um den Wert mit doppelten Anführungszeichen hinzu: buildConfigField "String", APP_VERSION, ' "0.0.1" '(natürlich ohne Leerzeichen)
Pierre

Antworten:

254

Build-Konfigurationsfelder vom Typ String sollten wie folgt deklariert werden:

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

der Feldname in Anführungszeichen, der Feldwert in Anführungszeichen zusätzlich.

Vladyslav Matviienko
quelle
1
Die Frage sollte 'SERVER_URL' als Variable verwenden. Wenn Sie "SERVER_URL" in Anführungszeichen setzen, wird der Wert zu einem String-Literal. Die Antwort von @ madhead ist daher korrekter (und hübscher).
Will Vanderhoef
1
@ WillVanderhoef, du liegst völlig falsch. Es funktioniert einfach nicht, wenn Sie keine SERVER_URLAnführungszeichen setzen. Sie würden es wissen, wenn Sie es selbst versuchen würden, bevor Sie einen Kommentar abgeben. Die Fehlermeldung istError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Vladyslav Matviienko
Mein Fehler. Ich habe Simas 'Antwort als Basis verwendet und sie einfach kopiert. Mein Punkt war nicht das dritte Feld (Variablenname), sondern die Verwendung von doppelten Anführungszeichen, um den Variablenwert zu umgehen: Wenn die Variable selbst keine doppelten Anführungszeichen enthält, können Sie einfach einfache äußere Anführungszeichen verwenden, um Backslashes zu entfernen. Ich habe beide Antworten bearbeitet.
Madhead
@VladMatvienko funktioniert definitiv, ich benutze es tatsächlich so, wie ich es beschreibe. def FIELD_NAME = "SERVER_URL"und buildConfigField "boolean", FIELD_NAME, "false"gut zusammenarbeiten. Wenn Sie die Definition von SERVER_URL vermissen, stürzen Sie ab, wahrscheinlich machen Sie das falsch.
Will Vanderhoef
2
@ WillVanderhoef, ja, das haben Sie vergessen zu erwähnen - Sie verwenden die Anführungszeichen während der Definition. Ihre Lösung hat also 1 zusätzliche Zeile und verwendet auch Anführungszeichen. Deshalb ist sie nicht so gut wie meine.
Vladyslav Matviienko
95

Warum sind alle so verrückt danach, doppelten Anführungszeichen zu entkommen? Sieht hässlich aus! Das ist Groovy, Leute, ihr könnt einfach einfache und doppelte Anführungszeichen mischen:

buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
verrückter Kopf
quelle
5
Das ist immer noch nicht der richtige Weg, wir sollten nicht entkommen oder verschachtelte Anführungszeichen verwenden müssen, da es String ist
Fabio
4
@Fabio Die Verwendung verschachtelter Anführungszeichen ermöglicht die Verwendung von Ausdrücken, die ausgewertet werden können. Siehe diese Antwort .
Albert Vila Calvo
31

Wenn Sie mit "Lösen der Probleme" meinen, dass Sie Literale nicht doppelt zitieren müssen, bin ich auf nichts gestoßen, da es wie geplant zu funktionieren scheint.

Ich habe damit experimentiert, die Literale in " gradle.properties " zu verschieben als " zu verschieben und möglicherweise mehrere hässliche Zeilen in eine hässliche Zeile .

Wie so:

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

Weitere Gedanken:


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
quelle
Ich habe ein Build-Konfigurationsfeld und ich möchte auf diese Variable in myn def in demselben Gradle zugreifen. Ich bin neu in Gradle PLZ Helpp!
Adeel Turk
Danke für das CONFIG-Skript! Im Team haben wir es leicht verbessert, um eine Ausnahme zu werfen, wenn var nicht existiert: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee
9

Ich war auch verwirrt. Aber es gibt einen Sinn - "String" definiert den Feldtyp, während der Feldwert nicht automatisch in Anführungszeichen gesetzt wird, damit wir hier Ausdrücke verwenden können:

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

Sonst wäre es nicht möglich.

geiger
quelle
Es ist möglich, wenn Sie eine String-Interpolation verwenden, z. B.: BuildConfigField "String", "TEST", "\" $ {10} \ "" Auf diese Weise können Sie auch Methoden oder Variablen in Ihrer Build-Datei verwenden.
Szörényi Ádám
9

Entfliehen Sie Ihren Zeichenfolgen:

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

Verwenden

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

für Variable. Referenz von hier

Audi
quelle
2

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

dann 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";  
}
Yitai Wei
quelle
1
Nur-Code-Antworten werden wirklich nicht empfohlen. Um zukünftigen Lesern zu helfen, erklären Sie bitte auch, was Sie tun!
itsmysterybox
und beim nächsten Mal Verweis auf Ihre vorherige Antwort stackoverflow.com/a/53056170/1084764 anstatt nur das Einfügen zu kopieren
Raykud
0

Nur " my stuff" hat bei mir funktioniert. Und ich habe alle möglichen seltsamen Charaktere dabei my stuff.

Sevastyan Savanyuk
quelle