एंड्रॉइड ग्रैडल 3.0.0-अल्फा 2 प्लगइन, केवल-पढ़ी गई संपत्ति 'outputFile' का मान सेट नहीं कर सकता


86

मैं इस कोड का उपयोग कर रहा था

applicationVariants.all { variant -> 
    variant.outputs.each { output ->
        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = 
        variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def date = new Date()
        def formattedDate = date.format('ddMMyy_HHmm')
        def newApkName = PROJECT_NAME + SEP + flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"
        def file = new File(newApkName)
        output.outputFile = file
    }
}


जब मैं नई एपीके का निर्माण करता हूं, तो एपीके फ़ाइल का नाम बदल सकता हूं, लेकिन जब से मैं एंड्रॉइड स्टूडियो 3.0 कैनरी 2 का उपयोग करता हूं, तो यह त्रुटि दिखाई देती है:
केवल-पढ़ी गई संपत्ति 'outputFile' का मान सेट नहीं किया जा सकता ...।


1
heres बुरी खबर समझाया, developer.android.com/studio/preview/features/… , जाहिर है एक नया एपीआई यह हल करने के लिए योजना बनाई है। उस लिंक पेज के नीचे स्क्रॉल करें।
हेक्टर

जवाबों:


207

के रूप में एंड्रॉयड प्लगइन 3.0 माइग्रेशन मार्गदर्शिका पता चलता है:

  • के all()बजाय का उपयोग करेंeach()
  • outputFileNameइसके बजाय इसका उपयोग करें output.outputFileयदि आप केवल फ़ाइल नाम बदलते हैं (जो कि आपका मामला है)

गाइड से उदाहरण:

// If you use each() to iterate through the variant objects,
// you need to start using all(). That's because each() iterates
// through only the objects that already exist during configuration time—
// but those object don't exist at configuration time with the new model.
// However, all() adapts to the new model by picking up object as they are
// added during execution.
android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

1
मुझे केवल नाम ही नहीं बल्कि आउटपुट फ़ाइल पथ को बदलने की आवश्यकता है।
अमृत ​​बिदरी

@ArrutBidri, मुझे लगता है कि एक नया सवाल पूछना सबसे अच्छा होगा (यदि यह पहले से ही एसओ पर कहीं जवाब नहीं है)। यह प्रश्न केवल फ़ाइल नाम बदलने के लिए था।
पवेल नाडोलस्की

हाँ, यह काम करता है, मेरा बुरा, यह मेरे स्वयं के प्लगइन के साथ मुद्दा था जो ग्रेडल संस्करण की जांच करता है।
सैंड्रस्टार

7

निचे देखो:

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def newApkName = applicationId + "-" + variant.versionName + "(" + variant.versionCode + ")" + ".apk";
        outputFileName = new File("${project.projectDir}/../outputs/apks/" + variant.name, newApkName);
    }
}

1
यह काम करता है, लेकिन आप आउटपुट डायरेक्टरी को नहीं बदल सकते हैं
just_user

मुझे केवल नाम ही नहीं बल्कि आउटपुट फ़ाइल पथ को बदलने की आवश्यकता है।
अमृत ​​बिदरी

त्रुटि प्राप्त करना: आउटपुट फ़ाइल नाम सेट करते समय निरपेक्ष पथ का समर्थन नहीं किया जाता है
ozmank

4

नीचे कोड मेरे लिए एंड्रॉइड स्टूडियो कैनरी 3.0.0-अल्फा 3 पर काम कर रहा है

android.applicationVariants.all {
    variant.outputs.all {
        def newApkName
        newApkName = "APPLICATION_NAME-" + defaultConfig.versionName + "-" + defaultConfig.versionCode".apk"
        outputFileName = newApkName;
    }
}

इससे एपीके फ़ाइल का नाम बदल जाता है


Com.android.build.gradle.internal.api.ApplicationVariantImpl के प्रकार के लिए अज्ञात संपत्ति 'वैरिएंट' प्राप्त नहीं कर सका।
ओजमंक

2

यह इस प्रश्न का पूर्ण उदाहरण है।

केवल आपको उत्पाद के बाद अपने ग्रेड में 3.0+ पेस्ट करना होगा

    android.applicationVariants.all { variant ->
    variant.outputs.all {

        def SEP = "_"
        def flavor = variant.productFlavors[0].name
        def buildType = variant.variantData.variantConfiguration.buildType.name
        def version = variant.versionName
        def versionCode = variant.versionCode
        def date = new Date();
        def formattedDate = date.format('ddMMyy_HHmm')

        outputFileName = "${flavor}${SEP}${buildType}${SEP}${version}${SEP}${versionCode}${SEP}${formattedDate}.apk"
    }
    }

क्या आपने इसे अपने gradle में 3.0+ और productFlavours के बाद पेस्ट किया है ?? आप जासूसी त्रुटि डाल सकते हैं?
पेबेल

0

मैंने स्थापित किया है 3.0 ग्रेडिएल अब काम नहीं करता है। स्रोत लिंक

हालाँकि, अधिक जटिल कार्य जिनमें आउटपुट आउटपुट तक पहुँच शामिल है, अब काम नहीं करते हैं। ऐसा इसलिए है क्योंकि कॉन्फ़िगरेशन चरण के दौरान संस्करण-विशिष्ट कार्य अब नहीं बनाए जाते हैं। इसके परिणामस्वरूप प्लगइन को सामने वाले के सभी आउटपुटों का पता नहीं चलता है, लेकिन इसका अर्थ तेज़ कॉन्फ़िगरेशन समय भी है।

तब मैंने gradlewप्रोजेक्ट.और कंपाइल करने के लिए कमांड का उपयोग कियाcp मेरी निर्दिष्ट पथ के लिए उत्पादन apk

Execute शेल में, मैंने कमांड के नीचे रखा।

./gradlew clean assembleDebug
cp $WORKSPACE/app/build/outputs/apk/debug/*.apk $WORKSPACE/JenkinsApk

क्या आप इसका उदाहरण दे सकते हैं?
अमृत ​​बिदरी

0

मुझे भी यही समस्या थी। त्रुटि "केवल-पढ़ी गई संपत्ति 'outputFile' का मान सेट नहीं किया जा सकता ...."

तो मैंने जो किया वह प्रोजेक्ट स्ट्रक्चर विंडो में एंड्रॉइड प्लगइन रिपॉजिटरी के संस्करण को बदलकर 2.3.3 कर दिया गया है। यह अब काम करता है और त्रुटि उत्पन्न हुई।

प्रोजेक्ट संरचना

बाद में, परियोजना के लिए स्वच्छ और पुनर्निर्माण करें और यही वह है

आशा है कि यह आपके लिए उपयोगी होगा।


0

यह सवाल पूछे जाने के बाद से डेढ़ साल है लेकिन शायद इससे किसी (मेरे जैसे) को मदद मिलेगी, जो पहले इस पद को हासिल करता है। मेरा मानना ​​है कि फ़ाइल का नाम और निर्देशिका बदलने का उत्तर यहां दिया गया था ।

applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def relativeRootDir = output.packageApplication.outputDirectory.toPath()
                     .relativize(rootDir.toPath()).toFile()
            output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
        }
    }

-1

एंड्रॉइड स्टूडियो 3.0.0 को अपडेट करने और नए ग्रेडेल का उपयोग करने के बाद, अब, एप्स का आउटपुट फ्लेवर्स नाम और बिल्ड प्रकारों द्वारा निर्देशिकाओं में वितरित किया जाएगा।

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