Dize türü ile buildConfigField nasıl oluşturulur


145

Projemde Android Studioiki tane build configurationvar 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'
    }
}

Aşağıdaki gibi alıyorum ve hata:

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

oluşturulan BuildConfig.javaaşağıdaki gibidir:

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

Bence APP_VERSIONve SERVER_URLonlar tırnak yok Dize türü olarak düzgün oluşturuluyor.

Neden bu şekilde üretildiğinden emin değilim. Lütfen bu sorunları nasıl çözebilirim?


Sadece çift tırnak işaretleri ile değerin etrafına tek tırnak ekleyin: buildConfigField "String", APP_VERSION, ' "0.0.1" '(tabii ki boşluk olmadan)
— Pierre

Yanıtlar:


254

Dize türü derleme yapılandırma alanları şu şekilde bildirilmelidir:

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

tırnak işareti içinde alan adı, çıkış karakterindeki alan değeri ek olarak.


1
Soru 'SERVER_URL' değişkenini kullanmayı amaçlıyordu. "SERVER_URL" değerini tırnak içine almak değeri Dize değişmez yapar. @ madhead'in cevabı bu yüzden daha doğru (ve daha güzel).
— Will Vanderhoef

1
@ WillVanderhoef, tamamen yanılıyorsun. SERVER_URLTırnak işaretleri koymazsanız işe yaramaz . Yorum yapmadan önce kendiniz denediyseniz bilirsiniz. Hata mesajıError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
— Vladyslav Matviienko

Benim hatam. Simas'ın cevabını bir üs olarak kullandım ve kopyaladım. Demek istediğim, üçüncü alanla (değişken adı) değil, değişken değerden kaçmak için çift tırnak kullanmakla ilgiliydi: değişkenin kendisinde çift tırnak yoksa, ters eğik çizgilerden kurtulmak için tek dış tırnak kullanabilirsiniz. Her iki yanıtı da düzenledim.
— madhead

@VladMatvienko kesinlikle çalışıyor, aslında tarif ettiğim şekilde kullanıyorum. def FIELD_NAME = "SERVER_URL"ve buildConfigField "boolean", FIELD_NAME, "false"birlikte iyi çalışır. Eğer SERVER_URL tanımını kaçırıyorsanız, muhtemelen yanlış yaptığınız şey budur.
— Vanderhoef

2
@WillVanderhoef, evet, bundan bahsetmeyi unuttun - alıntı sırasında tırnak işaretlerini kullanıyorsun. Bu yüzden çözümünüzün 1 ekstra satırı vardır ve tırnak işaretleri de kullanır ve bu yüzden benim kadar iyi değil.
— Vladyslav Matviienko

96

Neden herkes çift tırnak kaçmak için bu kadar kızgın? Çirkin gözüküyor! Bu harika, çocuklar, tek ve çift tırnakları karıştırabilirsiniz:

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

5
Bu hala gitmenin yolu değil, String olduğundan kaçmak veya iç içe tırnak kullanmak zorunda olmamalıyız
— Fabio

4
@Fabio Yuvalanmış tırnak işaretlerinin kullanılması, değerlendirilebilecek ifadelerin kullanılmasına izin verir. Bu cevaba bakınız .
— Albert Vila Calvo

31

"Sorunları çözerek", kelimenin tam anlamıyla alıntı yapmak zorunda kalmamanız anlamına geliyorsa, tasarlandığı gibi çalıştığı için hiçbir şeyle karşılaşmadım.

Değişmezleri bir çözüm olarak " gradle.properties " e taşıyarak, birden fazla çirkin çizgiyi çirkin bir çizgiye dönüştürmeyi deniyorum .

Şöyle ki:

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

Diğer düşünceler:


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

Ben bir yapı yapılandırma alanı var ve ben aynı sınıfta myn def bu değişken erişmek istiyorum .. ben plz helpp çakmak için yeni!
— Adeel Turk

CONFIG betiği için teşekkürler! Takımda var yoksa istisna atmak için biraz geliştirdik: CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
— demaksee

9

Ben de kafam karıştı. Ancak bir anlam vardır - "String", alanın türünü tanımlar; buna karşılık, burada ifadeleri kullanmamıza izin vermek için alan değeri otomatik olarak alıntılanmaz:

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

Aksi takdirde mümkün olmazdı.


Dize enterpolasyonu kullanabilirsiniz, örneğin: buildConfigField "String", "TEST", "\" $ {10} \ "" Bu şekilde derleme dosyanızdaki yöntemleri veya değişkenleri de kullanabilirsiniz.
— Szörényi Ádám

9

Dize tırnak kaçış:

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

5

kullanım

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

değişken için. Buradan referans


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
}

sonra BuildConfig içinde

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
Yalnızca kod yanıtları gerçekten önerilmez. Gelecekteki okuyuculara yardımcı olmak için lütfen ne yaptığınızı da açıklayın!
— itsmysterybox

ve bir dahaki sefere daha önceki yanıtınıza referans sadece kopya yapıştırma yerine stackoverflow.com/a/53056170/1084764
— Raykud

0

Sadece \ " my stuff\" benim için çalıştı. Ve içinde her çeşit garip karakter var my stuff.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.