Як генерувати buildConfigField з типом String


145

У моєму 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" '(без пробілів звичайно)
П'єр,

Відповіді:


254

Поля настройки конфігурації рядка повинні бути оголошені таким чином:

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

назва поля в лапках, додаткове значення поля в уникнутих лапках.


1
Питання покликане використовувати "SERVER_URL" як змінну. Якщо ввести лапки "SERVER_URL" у лапки, це робить значення String буквальним. @ відповідь madhead є правильнішою (і красивішою).
Буде Вандерхоф

1
@WillVanderhoef, ти абсолютно помилився. Це просто не працює, якщо ви не ставите SERVER_URLцитати. Ви б знали це, якби ви спробували це самі, перш ніж коментувати. Повідомлення про помилкуError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
Владислав Матвієнко

Моє ліжко. Я використав відповідь Сімаса як основу і просто скопіював її. Моя думка полягала не в третьому полі (назва змінної), а в використанні подвійних лапок для уникнення значення змінної: якщо сама змінна не має подвійних лапок, ви можете просто поодинокі лапки, щоб позбутися від косої риски. Я відредагував обидві відповіді.
озлоблений

@VladMatvienko, безумовно, працює, я фактично використовую його так, як описую. def FIELD_NAME = "SERVER_URL"і buildConfigField "boolean", FIELD_NAME, "false"працювати просто чудово разом. Якщо вам не вистачає визначення SERVER_URL, ви зринетесь, це, мабуть, ви робите неправильно.
Буде Вандерхоф

2
@WillVanderhoef, так, це ви забули згадати - ви використовуєте цитати під час визначення. Тож у вашому рішенні є 1 додатковий рядок, і він також використовує лапки, і тому воно не так добре, як моє.
Владислав Матвієнко

96

Чому всі такі божевільні уникнути подвійних цитат? Виглядає некрасиво! Це Groovy, хлопці, ви можете просто змішувати одиночні та подвійні лапки:

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

5
Це все ще не шлях, нам не слід бігти або використовувати вкладені цитати, оскільки це String
Фабіо

4
@Fabio Використання вкладених лапок дозволяє використовувати вирази, які можна оцінити. Дивіться цю відповідь .
Альберт Віла Кальво

31

Якщо під "вирішенням питань" ви маєте на увазі не потребу в подвійному цитуванні літералів, я нічого не стикався, як здається, працює як задумано.

Я експериментував із переміщенням літералів у " 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)}" }
...

У мене є поле конфігурації збірки, і я хочу отримати доступ до цієї змінної в My Def в тому ж gradle .. Я новачок у helple help gradle!
Адель Турк

Дякуємо за сценарій CONFIG! У команді ми трохи покращили його, щоб кинути виняток, якщо var не існує: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
demaksee

9

Я також розгубився. Але є сенс - "Рядок" визначає тип поля, тоді як значення поля не цитується автоматично, щоб ми могли використовувати тут вирази:

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

Інакше це було б неможливо.


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

9

Уникніть своїх рядкових цитат:

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


2

у програмі 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 замість просто копіювання вставки
Raykud

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.