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.