Как создать buildConfigField с типом String


162

В моем Android Studioпроекте их два build configurationс некоторыми 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'
    }
}

Я получаю следующее сообщение об ошибке:

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

сгенерированный BuildConfig.javaвыглядит следующим образом:

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

Я думаю, что APP_VERSIONи SERVER_URLне генерируются должным образом, поскольку являются типом String, у них нет кавычек.

Я не уверен, почему он создается таким образом. Пожалуйста, дайте мне знать, как я могу решить эту проблему.


Просто добавьте одинарные кавычки вокруг значения с двойными кавычками: buildConfigField "String", APP_VERSION, ' "0.0.1" '(без пробелов, конечно)
Пьер

Ответы:


271

Поля конфигурации сборки строкового типа должны быть объявлены следующим образом:

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

имя поля в кавычках, значение поля в экранированных кавычках дополнительно.


1
Вопрос предназначался для использования «SERVER_URL» в качестве переменной. Заключение «SERVER_URL» в кавычки делает значение строковым литералом. Следовательно, ответ @ madhead более правильный (и красивее).
Will Vanderhoef

Виноват. Я использовал ответ Симаса как основу и просто скопировал его. Я хотел сказать не о третьем поле (имя переменной), а об использовании двойных кавычек для экранирования значения переменной: если сама переменная не имеет двойных кавычек, вы можете просто одинарные внешние кавычки, чтобы избавиться от обратной косой черты. Я редактировал оба ответа.
madhead

@VladMatvienko определенно работает, я использую именно так, как описываю. def FIELD_NAME = "SERVER_URL"и buildConfigField "boolean", FIELD_NAME, "false"прекрасно работают вместе. Если вам не хватает определения SERVER_URL, произойдет сбой, вероятно, вы делаете неправильно.
Уилл Вандерхоф

Используйте buildConfigField "String", "FILE_NAME", "\" {$ fileName} \ "" для имен переменных.
Audi

@Audi, спасибо, но это именно то, о чем говорится в моем ответе (уже 3 года)
Владислав Матвиенко

100

Почему все так без ума от двойных кавычек? Выглядит некрасиво! Это Groovy, ребята, вы можете просто смешивать одинарные и двойные кавычки:

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

5
Это все еще не выход, нам не нужно избегать его или использовать вложенные кавычки, так как это String
Фабио

4
@Fabio Использование вложенных кавычек позволяет использовать выражения, которые можно вычислить. Смотрите этот ответ .
Альберт Вила Кальво

Есть ли причина, по которой вы заключаете Stringдвойные кавычки и SERVER_URLодинарные кавычки?
Адам Джонс,

@AdamJohns, наверное, нет. Просто чтобы продемонстрировать, что и то, 'и другое "можно использовать.
madhead

34

Если под «решением проблем» вы имеете в виду отсутствие необходимости использовать литералы в двойных кавычках, я ничего не встречал, поскольку, похоже, он работает так, как задумано.

Я экспериментировал с перемещением литералов в « gradle.properties » в качестве обходного пути, превращая потенциально несколько уродливых строк в одну уродливую.

Вот так:

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

Дальнейшие мысли:


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

У меня есть поле конфигурации сборки, и я хочу получить доступ к этой переменной в myn def в том же Gradle .. Я новичок в gradle plz helpp !!
Adeel Turk 08

1
Спасибо за скрипт CONFIG! В команде мы немного улучшили его, чтобы генерировать исключение, если var не существует: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee

10

Избегайте строковых кавычек:

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

9

Я тоже был сбит с толку. Но есть смысл - «Строка» определяет тип поля, тогда как значение поля не цитируется автоматически, чтобы мы могли использовать здесь выражения:

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

В противном случае это было бы невозможно.


Это возможно, если вы используете строковую интерполяцию, например: buildConfigField "String", "TEST", "\" $ {10} \ "" Таким образом вы также можете использовать методы или переменные в вашем файле сборки.
Szörényi Ádám


1

в приложении 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
}

затем в 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
Ответы только на код действительно не приветствуются. Чтобы помочь будущим читателям, объясните, пожалуйста, чем вы тоже занимаетесь!
itsmysterybox

и в следующий раз ссылка на ваш предыдущий ответ stackoverflow.com/a/53056170/1084764 вместо простого копирования вставки
Райкуд

1

Мы должны убрать нашу константу Gradle, определенную в наших свойствах Gradle или где-то еще:

buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""

Где CONSTANT_VALUEопределено в нашем gradle.propertiesили еще где-то:

CONSTANT_VALUE=string_goes_here

То же самое применяется и при получении констант, полученных из нашей среды:

buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""

Решение, получившее наибольшее количество голосов, работает в случае, если нам просто нужно добавить String вручную , это решение просто идет дальше.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.