कैसे स्ट्रिंग प्रकार के साथ buildConfigField उत्पन्न करने के लिए


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उनके पास उद्धरण नहीं हैं।

मुझे यकीन नहीं है कि यह इस तरह से क्यों उत्पन्न किया जा रहा है। कृपया मुझे बताएं कि मैं इस मुद्दों को कैसे हल कर सकता हूं।


बस दोहरे उद्धरण चिह्नों के साथ मूल्य के आसपास एकल उद्धरण जोड़ें: buildConfigField "String", APP_VERSION, ' "0.0.1" '(पाठ्यक्रम के रिक्त स्थान के बिना)
Pierre

जवाबों:


254

स्ट्रिंग प्रकार बिल्ड कॉन्फ़िगरेशन फ़ील्ड इस तरह घोषित की जानी चाहिए:

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

उद्धरण में फ़ील्ड का नाम, अतिरिक्त रूप से भाग गए उद्धरणों में फ़ील्ड मान।


1
प्रश्न का उद्देश्य 'SERVER_URL' को एक चर के रूप में उपयोग करना है। "SERVER_URL" को उद्धरण चिह्नों में रखने से मूल्य एक स्ट्रिंग शाब्दिक बन जाता है। @ मैडहेड का उत्तर इसलिए अधिक सही (और प्रेटियर) है।
विल वन्डरोफ

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

डबल कोट्स से बचने के लिए हर कोई इतना पागल क्यों है? बदसूरत लग रहा है! यह ग्रूवी है, दोस्तों, आप केवल सिंगल और डबल कोट्स को मिला सकते हैं:

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

5
यह अभी भी जाने का रास्ता नहीं है, हमें भागना नहीं चाहिए या इसका उपयोग नहीं किया है क्योंकि यह स्ट्रिंग है
Fabio

4
@ फैबियो नेस्टेड कोट्स का उपयोग करके उन भावों का उपयोग करने की अनुमति देता है जिनका मूल्यांकन किया जा सकता है। इस जवाब को देखें ।
अल्बर्ट विला कैल्वो

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

मेरे पास एक बिल्ड कॉन्फिगर फील्ड है और मैं उसी वेरिएबल में myn def के वैरिएबल को एक्सेस करना चाहता हूं .. मैं gradle plz हेल्प के लिए नया हूं !!
तुर्क

CONFIG स्क्रिप्ट के लिए धन्यवाद! अगर टीम मौजूद नहीं है तो टीम को अपवाद में फेंकने के लिए हमने इसमें थोड़ा सुधार किया: 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 "स्ट्रिंग", "टेस्ट", "\" $ {10} \ "" इस तरह से आप अपनी बिल्ड फ़ाइल में तरीकों या चर का उपयोग कर सकते हैं।
Szörényi Ádám

9

अपने स्ट्रिंग उद्धरण से बचिए:

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


2

एप्लिकेशन बिल्ड में .ग्रेड करें

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
}

फिर बिल्डकॉन्फिग में

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
कोड केवल जवाब वास्तव में हतोत्साहित कर रहे हैं। भविष्य के पाठकों की मदद करने के लिए, कृपया समझाएं कि आप क्या कर रहे हैं!
इसका

और अगली बार अपने पिछले उत्तर के संदर्भ में stackoverflow.com/a/53056170/1084764 को कॉपी पेस्ट करने के बजाय
Raykud

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.