স্ট্রিং টাইপ সহ বিল্ডকনফিগফিল্ড কীভাবে জেনারেট করা যায়


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স্ট্রিং টাইপ তারা কোট না হচ্ছে সঠিকভাবে উত্পন্ন পাচ্ছে না।

আমি নিশ্চিত নই কেন এটি কেন এমনভাবে উত্পাদিত হচ্ছে। আমি কীভাবে এই সমস্যাগুলি সমাধান করতে পারি তা আমাকে জানান let


ডাবল কোট দিয়ে মানটির চারদিকে কেবল একক কোট যুক্ত করুন: buildConfigField "String", APP_VERSION, ' "0.0.1" '(স্পেস ছাড়াই)
পিয়েরে

উত্তর:


254

স্ট্রিং টাইপ বিল্ড কনফিগারেশন ক্ষেত্রগুলি এই জাতীয়ভাবে ঘোষণা করা উচিত:

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

উদ্ধৃতিতে ক্ষেত্রের নাম, অতিরিক্ত রক্ষা উদ্ধৃতিতে ক্ষেত্রের মান।


1
প্রশ্নটি ভেরিয়েবল হিসাবে 'SERVER_URL' ব্যবহার করার উদ্দেশ্যেছিল। "SERVER_URL" উদ্ধৃতিতে রাখা মানটিকে একটি স্ট্রিং আক্ষরিক করে তোলে। @ ম্যাডহেডের উত্তর তাই আরও সঠিক (এবং সুন্দর)।
ভ্যান্ডারফয়েফ

1
@ উইলভান্ডারহয়েফ, আপনি সম্পূর্ণ ভুল আপনি SERVER_URLউদ্ধৃতি না রাখলে এটি কার্যকরভাবে কাজ করে না । মন্তব্য করার আগে যদি আপনি নিজে চেষ্টা করে থাকেন তবে আপনি এটি জানতেন। ত্রুটির বার্তাটি হ'লError:(32, 0) Could not find property 'SERVER_URL' on BuildType_...
ভ্লাদিস্লাভ ম্যাটভিয়েনকো

আমার খারাপ। আমি সিমাসের উত্তরটিকে বেস হিসাবে ব্যবহার করেছি এবং কেবল এটি অনুলিপি করেছি। আমার বক্তব্যটি তৃতীয় ক্ষেত্র (ভেরিয়েবলের নাম) সম্পর্কে নয়, ভেরিয়েবলের মান থেকে বেরিয়ে আসার জন্য ডাবল কোট ব্যবহারের বিষয়ে ছিল: যদি ভেরিয়েবলের নিজস্ব ডাবল কোট না থাকে তবে আপনি ব্যাকস্ল্যাশগুলি থেকে মুক্তি পেতে কেবল একক বহিরাগত উদ্ধৃতি দিতে পারেন। আমি উভয় উত্তর সম্পাদনা করেছি।
ম্যাডহেড

@ ভ্লাদমাটভিয়েনকো অবশ্যই কাজ করে, আমি যেভাবে বর্ণনা করব সেভাবেই এটি ব্যবহার করছি। def FIELD_NAME = "SERVER_URL"এবং buildConfigField "boolean", FIELD_NAME, "false"একসাথে ঠিক কাজ। আপনি যদি SERVER_URL- এর সংজ্ঞাটি হারিয়ে ফেলেন তবে আপনি ক্র্যাশ হয়ে যাবেন, সম্ভবত এটিই আপনি ভুল করছেন।
ভান্ডারহয়েফ

2
@ উইলভান্ডারহয়েফ, হ্যাঁ, আপনি উল্লেখ করতে ভুলে গেছেন - সংজ্ঞা দেওয়ার সময় আপনি উদ্ধৃতিগুলি ব্যবহার করেন। সুতরাং আপনার দ্রবণটিতে 1 টি অতিরিক্ত লাইন রয়েছে এবং পাশাপাশি উদ্ধৃতিগুলিও ব্যবহার করা হয় এবং সে কারণেই এটি আমার মতো ভাল নয়।
ভ্লাদিস্লাভ মাতভিয়েনকো

95

কেন সবাই ডাবল উক্তি থেকে বাঁচতে এত পাগল? দেখতে কুৎসিত! এটি গ্রোভী, বন্ধুরা, আপনি কেবল একক এবং ডাবল উদ্ধৃতিগুলি মিশ্রিত করতে পারেন:

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

5
এটি এখনও যাওয়ার উপায় নয়, স্ট্রিং হওয়ার পরে আমাদের এড়ানোর বা নেস্টেড কোটগুলি ব্যবহার করা উচিত নয়
ফ্যাবিও

4
@ ফ্যাবিও নেস্টেড কোট ব্যবহার করে এমন মূল্যবোধ ব্যবহারের অনুমতি দেয় যা মূল্যায়ন করা যায়। এই উত্তর দেখুন ।
অ্যালবার্ট ভিলা ক্যালভো

31

যদি "সমস্যার সমাধান" করার অর্থ যদি আপনার অর্থ হ'ল ডাবল উদ্ধৃতি না হয় তবে আমি কোনও কিছুই পাইনি বলে মনে হয় এটি নকশাকৃতভাবে কাজ করছে।

আমি আক্ষরিকগুলিকে " গ্রেডেল.প্রপ্রেটিস " এ একটি কার্যনির্বাহী হিসাবে স্থানান্তরিত করার জন্য পরীক্ষা-নিরীক্ষা করে চলেছি , সম্ভাব্য একাধিক কুরুচিপূর্ণ রেখাকে এক কুরুচিপূর্ণ লাইনে পরিণত করেছি।

তাই ভালো:

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

আমার একটি বিল্ড কনফিগারেশন ফিল্ড রয়েছে এবং আমি একই গ্রেডে মেন ডিএফ-তে সেই পরিবর্তনশীলটি অ্যাক্সেস করতে চাই .. আমি গ্রেড প্লাজ হেল্পে নতুন!
আদিল তুর্ক

কনফিগ স্ক্রিপ্ট জন্য ধন্যবাদ! দলে আমরা কিছুটা উন্নত করেছি যদি CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
ভেরটি

9

আমিও বিভ্রান্ত হয়ে পড়েছিলাম। তবে একটি ধারণা আছে - "স্ট্রিং" ক্ষেত্রের ধরণকে সংজ্ঞায়িত করে, যেখানে ক্ষেত্রের মানটি আমাদের এখানে অভিব্যক্তি ব্যবহার করার অনুমতি দেওয়ার জন্য স্বয়ংক্রিয়ভাবে উদ্ধৃত হয় না:

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

অন্যথায় এটি সম্ভব হত না।


যদি আপনি স্ট্রিং ইন্টারপোলেশন ব্যবহার করেন তবে এটি সম্ভব: যেমন: বিল্ডকনফিগফিল্ড "স্ট্রিং", "টেস্ট", "\" $ {10} \ "" এইভাবে আপনি নিজের বিল্ড ফাইলেও পদ্ধতি বা ভেরিয়েবল ব্যবহার করতে পারেন।
Szörényi ádám

9

আপনার স্ট্রিং উদ্ধৃতি এড়ান:

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

5

ব্যবহার

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

পরিবর্তনশীল জন্য। এখান থেকে রেফারেন্স


2

app build.gradle এ rad

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
কোড শুধুমাত্র উত্তর সত্যিই নিরুৎসাহিত করা হয়। ভবিষ্যতের পাঠকদের সহায়তার জন্য, আপনি খুব কি করছেন তা দয়া করে ব্যাখ্যা করুন!
#mysterybox

এবং আপনার আগের উত্তর পরের বার রেফারেন্স stackoverflow.com/a/53056170/1084764 পরিবর্তে শুধু পেস্ট কপি
Raykud

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.