मैं एक ग्रेड स्क्रिप्ट को दूसरे में कैसे आयात कर सकता हूं?


97

मेरे पास एक जटिल प्रवण लिपि है, जो कई नेटवर्क्स परियोजनाओं के निर्माण और तैनाती के आसपास कार्यक्षमता का एक भार उठाती है।

स्क्रिप्ट बहुत अच्छी तरह से काम करती है, लेकिन संक्षेप में यह परियोजना और पर्यावरण की जानकारी रखने वाले आधा दर्जन मानचित्रों के माध्यम से कॉन्फ़िगर किया गया है।

मैं कार्यों को एक अन्य फ़ाइल में अलग करना चाहता हूं, ताकि मैं अपने नक्शे को एक साधारण बिल्ड फ़ाइल में परिभाषित कर सकूं और अन्य फ़ाइल से कार्यों को आयात कर सकूं। इस तरह, मैं कई परियोजनाओं के लिए एक ही मूल कार्यों का उपयोग कर सकता हूं और उन परियोजनाओं को सरल सेट के साथ कॉन्फ़िगर कर सकता हूं।

क्या कोई मुझे बता सकता है कि चींटी के कार्य के समान तरीके से मैं एक ग्रेड फ़ाइल को दूसरे में कैसे आयात कर सकता हूं? मैंने ग्रैडल के डॉक्स को अब तक कोई फायदा नहीं पहुंचाया है।

अतिरिक्त जानकारी

नीचे टॉम की प्रतिक्रिया के बाद, मैंने सोचा कि मैं कोशिश करूँगा और स्पष्ट करूँगा कि मेरा क्या मतलब है।

मूल रूप से मेरे पास एक ढाल स्क्रिप्ट है जो कई सबप्रोजेक्ट चलाता है। हालाँकि, सबप्रोजेक्ट सभी नेटबिन प्रोजेक्ट हैं, और अपनी स्वयं की चींटी बिल्ड स्क्रिप्ट के साथ आते हैं, इसलिए मुझे इनमें से प्रत्येक को कॉल करने के लिए ग्रेडेल में कार्य हैं।

मेरी समस्या यह है कि फ़ाइल के शीर्ष पर मेरा कुछ विन्यास है, जैसे:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

मैं तब इस तरह के कार्य उत्पन्न करता हूं:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

मेरे पास इस तरह के कई कार्य पीढ़ी के स्निपेट्स हैं, और उनमें से सभी सामान्य हैं - वे पूरी तरह से प्रोजेक्ट सूची में कॉन्फ़िगरेशन पर निर्भर करते हैं।

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

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

तो इस उदाहरण में, task.gradle में सभी सामान्य कार्य पीढ़ी कोड होंगे, और मुख्य build.gradle फ़ाइल में परिभाषित परियोजनाओं के लिए चला जाएगा। इस तरह, टास्क.ग्रेड एक ऐसी फाइल है जिसका उपयोग सभी बड़ी परियोजनाओं द्वारा किया जा सकता है, जिसमें नेटबीन एंट बिल्ड फ़ाइलों के साथ कई उप-परियोजनाएं शामिल हैं।


3
बाहरी घोषणाओं को आयात करने के लिए "से लागू करें: 'other.gradle'" निर्माण पर विचार करें। (देखें "12.4। एक बाहरी बिल्ड स्क्रिप्ट का उपयोग करके परियोजना को कॉन्फ़िगर करना" यहां gradle.org/0.9-preview-1/docs/userguide/… )
पेट्र

@PetrGladkikh apply fromबाहरी कार्यों को तुरंत निष्पादित करता है। यह निष्पादन तर्क में बेहतर नहीं हो सकता है (यानी जब मैं चाहता हूं कि कार्यों को निष्पादित करना चाहता हूं, अभी नहीं)।
इगोरगानापल्स्की 13

ऊपर टिप्पणी में यह कथन सही नहीं है : apply fromबाहरी कार्यों को तुरंत निष्पादित करता है। गुमराह मत हो। बाहरी कार्यों को कॉन्फ़िगर किया गया है, निष्पादित नहीं किया गया है।
जेरेकाइक

संभावित डुप्लिकेट बनाने का एक तरीका है /
ग्रैड

जवाबों:


133

0.9 में एक नई सुविधा है। आप apply from: 'other.gradle'कमांड का उपयोग कर सकते हैं ।

एक ही बात के बारे में मेरा प्रश्न पढ़ें: क्या ग्रैडल के सामान्य भागों को विभाजित / फैक्टर करने का एक तरीका है


17

प्रश्न का उत्तर प्लगइन्स प्रणाली में निकला, जहां आप प्लगइन्स के एक सेट में वांछित कार्यक्षमता जोड़ सकते हैं जो निर्देशिका में स्थित ग्रूवी फाइलें हो सकती हैं buildSrc/src/main/groovy। प्लगइन्स को जार के रूप में बंडल किया जा सकता है, हालांकि मैंने यह कोशिश नहीं की है।

यहाँ विवरण: कस्टम प्लगइन्स


बस आपको पता है कि लिंक टूटा हुआ है - यहाँ एक अद्यतन gradle.org/docs/current/userguide/…
JARC

प्लगइन लिंक: gradle.org/docs/current/userguide/…
JARC

4

खैर, यह बताना कठिन है कि वास्तव में आपकी बिल्ड फ़ाइल को देखे बिना आप सबसे अच्छा क्या करते हैं।

मैं यह मान सकता था कि मल्टी-प्रोजेक्ट बिल्ड के रूप में आपके वातावरण को स्थिर करते हुए आपको वह अमूर्तता प्रदान करनी चाहिए जिसकी आप तलाश कर रहे हैं।

अपने प्रोजेक्ट रूट में build.gradleआप अपने सभी डोमेन विशिष्ट सामानों के साथ-साथ उन सभी चीजों को परिभाषित करते हैं जो आपके सभी सबप्रोजेक्ट पर लागू होती हैं :

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

प्रोजेक्ट रूट निर्देशिका में एक gradle.propertiesफ़ाइल भी हो सकती है जहाँ आप अपनी परियोजनाओं द्वारा उपयोग की जाने वाली संपत्तियों को परिभाषित करते हैं:

buildDirName=staging
repo.dest.dir=/var/repo
...

फिर अपने प्रोजेक्ट रूट से एक अतिरिक्त फाइल में जिसका नाम settings.gradleहै, वास्तव में आपके उपप्रोजेक्ट की ओर इशारा करता है:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

प्रत्येक उप-प्रोजेक्ट निर्देशिका में एक build.gradleफ़ाइल होती है जिसमें केवल उप-प्रोजेक्ट विशिष्ट सामग्री होती है।

कोई फर्क नहीं पड़ता अगर आप gradleअपनी परियोजना रूट या उप-परियोजना निर्देशिका से आह्वान करते हैं, तो वर्गीकृत स्वचालित रूप से विभिन्न फाइलों में की गई आपकी सभी परिभाषाओं पर विचार करेगा।

यह भी ध्यान दें कि जब तक आप रूट स्तर पर डिफ़ॉल्ट प्लगइन से परे किसी भी प्लगइन को लोड नहीं करते हैं, तब तक आपके प्रोजेक्ट रूट के लिए कोई संकलन कार्य निष्पादित नहीं किया जाएगा।


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

1
इसलिए अपने नमूने से आयात ("कार्य। क्रम") करने के बजाय आपके पास सबप्रोजेक्ट {} अनुभाग होगा जो आपके सभी उप-परियोजनाओं द्वारा उपयोग किए जाने वाले सामान्य कार्य पीढ़ी कोड को निर्दिष्ट करता है। यह वही अमूर्तता प्रदान करनी चाहिए जिसकी आप तलाश कर रहे हैं !?
टॉम

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