खोज…


बुनियादी ढांचा

  1. इन सामग्रियों के साथ SCALA_PROJECT/build.gradle नामक एक फ़ाइल बनाएँ:

    group 'scala_gradle'
    version '1.0-SNAPSHOT'
    
    apply plugin: 'scala'
    
    repositories {
        jcenter()
        mavenCentral()
        maven {
            url "https://repo.typesafe.com/typesafe/maven-releases"
        }
    }
    
    dependencies {
        compile group: 'org.scala-lang', name: 'scala-library', version: '2.10.6'
    }
    
    
    task  "create-dirs" << {
        sourceSets*.scala.srcDirs*.each { it.mkdirs() }
        sourceSets*.resources.srcDirs*.each { it.mkdirs() }
    }
    
    
  2. उपलब्ध कार्यों को देखने के लिए gradle tasks चलाएं।

  3. src/scala, src/resources डायरेक्टरी gradle create-dirs चलाएं।

  4. प्रोजेक्ट बनाने और निर्भरता डाउनलोड करने के लिए रन gradle build

अपनी खुद की ग्रेड स्कैला प्लगइन बनाएं

बेसिक सेटअप उदाहरण के माध्यम से जाने के बाद, आप अपने आप को हर एक स्काला ग्रैडल प्रोजेक्ट में इसका अधिकांश भाग दोहरा सकते हैं। बॉयलरप्लेट कोड जैसी गंध ...

क्या होगा, अगर ग्रेडल द्वारा पेश किए गए स्काला प्लगइन को लागू करने के बजाय, आप अपने स्वयं के स्काला प्लगइन को लागू कर सकते हैं, जो आपके सभी सामान्य बिल्ड लॉजिक को संभालने के लिए जिम्मेदार होगा, उसी समय, पहले से मौजूद प्लगइन।

यह उदाहरण पिछले बिल्ड लॉजिक को पुन: उपयोग करने योग्य ग्रेडल प्लगइन में बदलने वाला है।

लकीली, ग्रेड में, आप आसानी से कस्टम एपीआई को ग्रैडल एपीआई की मदद से लिख सकते हैं, जैसा कि प्रलेखन में उल्लिखित है। कार्यान्वयन की भाषा के रूप में, आप स्वयं या यहां तक कि जावा का उपयोग कर सकते हैं। हालाँकि, अधिकांश उदाहरण जो आप डॉक्स में पा सकते हैं, ग्रूवी में लिखे गए हैं। यदि आपको अधिक कोड नमूनों की आवश्यकता है या आप यह समझना चाहते हैं कि स्कैला प्लगइन के पीछे क्या है, उदाहरण के लिए, आप ग्रैंगल गीथो रेपो की जांच कर सकते हैं।

प्लगइन लेखन

आवश्यकताएँ

कस्टम प्लगइन एक परियोजना में लागू होने पर निम्नलिखित कार्यक्षमता जोड़ देगा:

  • एक scalaVersion संपत्ति ऑब्जेक्ट, जिसमें दो अतिदेय डिफ़ॉल्ट गुण होंगे
    • प्रमुख = "2.12"
    • मामूली = "0"
  • withScalaVersion फ़ंक्शन, जो एक निर्भरता नाम पर लागू होता है, द्विआधारी संगतता सुनिश्चित करने के लिए स्काला प्रमुख संस्करण जोड़ देगा (sbt %% ऑपरेटर घंटी बजा सकता है, अन्यथा आगे बढ़ने से पहले यहां जाएं)
  • createDirs कार्य आवश्यक निर्देशिका ट्री बनाने के लिए, पिछले उदाहरण के रूप में
कार्यान्वयन दिशानिर्देश
  1. एक नया ग्रेडल प्रोजेक्ट बनाएं और निम्न को build.gradle जोड़ें
apply plugin: 'scala'
apply plugin: 'maven'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile gradleApi()
    compile "org.scala-lang:scala-library:2.12.0"
}

नोट :

  • प्लगइन कार्यान्वयन स्काला में लिखा गया है, इस प्रकार हमें ग्रेडल स्काला प्लगिन की आवश्यकता है
  • अन्य परियोजनाओं से प्लगइन का उपयोग करने के लिए, ग्रेडल मेवेन प्लगिन का उपयोग किया जाता है; इसमें प्रोजेक्ट जार को मावेन लोकल रिपॉजिटरी में सहेजने के लिए उपयोग किए गए install टास्क को जोड़ा गया है
  • compile gradleApi() gradle-api-<gradle_version>.jar को gradle-api-<gradle_version>.jar जोड़ता है
  1. प्लगइन कार्यान्वयन के लिए एक नया स्काला क्लास बनाएं
package com.btesila.gradle.plugins 
 
import org.gradle.api.{Plugin, Project}  
 
class ScalaCustomPlugin extends Plugin[Project] {
    override def apply(project: Project): Unit = {
        project.getPlugins.apply("scala")
    }
}

नोट :

  • एक प्लगइन को लागू करने के लिए, बस प्रकार Project Plugin विशेषता का विस्तार करें और apply विधि को ओवरराइड करें
  • लागू करने की विधि के भीतर, आप उस Project उदाहरण तक पहुँच सकते हैं, जिस पर प्लगइन लागू होता है और आप इसे बिल्ड लॉजिक को जोड़ने के लिए उपयोग कर सकते हैं
  • यह प्लगइन कुछ भी नहीं करता है लेकिन पहले से मौजूद ग्रेडल स्काला प्लगिन को लागू करता है
  1. scalaVersion ऑब्जेक्ट गुण जोड़ें

सबसे पहले, हम एक ScalaVersion वर्ग बनाते हैं, जो दो संस्करण गुणों को धारण करेगा

class ScalaVersion {
  var major: String = "2.12"
  var minor: String = "0"
}

ग्रैडल प्लगइन्स के बारे में एक अच्छी बात यह है कि आप हमेशा विशिष्ट गुणों को जोड़ या ओवरराइड कर सकते हैं। एक प्लगइन माध्यम से उपयोगकर्ता इनपुट के इस प्रकार प्राप्त करता है ExtensionContainer एक Gradle से जुड़ी Project उदाहरण। अधिक जानकारी के लिए, इसे देखें।
निम्नलिखित को apply विधि में जोड़कर, हम मूल रूप से ऐसा कर रहे हैं:

  • अगर वहाँ एक नहीं है scalaVersion संपत्ति परियोजना में परिभाषित किया गया है, हम मूलभूत मूल्यों के साथ एक जोड़ने
  • अन्यथा, हमें वर्तमान में ScalaVersion उदाहरण के रूप में ScalaVersion , इसे आगे उपयोग करने के लिए
var scalaVersion = new ScalaVersion
if (!project.getExtensions.getExtraProperties.has("scalaVersion"))
   project.getExtensions.getExtraProperties.set("scalaVersion", scalaVersion)
else
   scalaVersion = project.getExtensions.getExtraProperties.get("scalaVersion").asInstanceOf[ScalaVersion]

यह प्लगइन को लागू करने वाली परियोजना की बिल्ड फ़ाइल के लिए निम्नलिखित लिखने के बराबर है:

ext {
    scalaVersion.major = "2.12"
    scalaVersion.minor = "0"

}

  1. scalaVersion का उपयोग करते हुए, प्रोजेक्ट निर्भरता के लिए scala-lang लाइब्रेरी scalaVersion
project.getDependencies.add("compile", s"org.scala-lang:scala-library:${scalaVersion.major}.${scalaVersion.minor}")

यह प्लगइन को लागू करने वाली परियोजना की बिल्ड फ़ाइल के लिए निम्नलिखित लिखने के बराबर है:

compile "org.scala-lang:scala-library:2.12.0"
  1. withScalaVersion फ़ंक्शन जोड़ें
val withScalaVersion = (lib: String) => {
    val libComp = lib.split(":")
    libComp.update(1, s"${libComp(1)}_${scalaVersion.major}")
    libComp.mkString(":")
}
project.getExtensions.getExtraProperties.set("withScalaVersion", withScalaVersion)
  1. अंत में, createDirs कार्य बनाएं और इसे प्रोजेक्ट में जोड़ें
    DefaultTask बढ़ाकर एक ग्रेड कार्य लागू करें:
class CreateDirs extends DefaultTask {
  @TaskAction
  def createDirs(): Unit = {
    val sourceSetContainer = this.getProject.getConvention.getPlugin(classOf[JavaPluginConvention]).getSourceSets

    sourceSetContainer forEach { sourceSet =>
      sourceSet.getAllSource.getSrcDirs.forEach(file => if (!file.getName.contains("java")) file.mkdirs())
    }
  }
}

नोट : SourceSetContainer पास परियोजना में मौजूद सभी स्रोत निर्देशिकाओं के बारे में जानकारी है। ग्रैडल स्कैला प्लगिन क्या करता है, जावा वाले को अतिरिक्त स्रोत सेट जोड़ना है, जैसा कि आप प्लगइन डॉक्स में देख सकते हैं।

इसे apply विधि से जोड़कर प्रोजेक्ट में createDir कार्य जोड़ें:

project.getTasks.create("createDirs", classOf[CreateDirs])

अंत में, आपके ScalaCustomPlugin वर्ग को इस तरह दिखना चाहिए:

class ScalaCustomPlugin extends Plugin[Project] {
  override def apply(project: Project): Unit = {
    project.getPlugins.apply("scala")

    var scalaVersion = new ScalaVersion
    if (!project.getExtensions.getExtraProperties.has("scalaVersion"))
      project.getExtensions.getExtraProperties.set("scalaVersion", scalaVersion)
    else
      scalaVersion = project.getExtensions.getExtraProperties.get("scalaVersion").asInstanceOf[ScalaVersion]

    project.getDependencies.add("compile", s"org.scala-lang:scala-library:${scalaVersion.major}.${scalaVersion.minor}")

    val withScalaVersion = (lib: String) => {
      val libComp = lib.split(":")
      libComp.update(1, s"${libComp(1)}_${scalaVersion.major}")
      libComp.mkString(":")
    }
    project.getExtensions.getExtraProperties.set("withScalaVersion", withScalaVersion)

    project.getTasks.create("createDirs", classOf[CreateDirs])
  }
}

स्थानीय मावेन भंडार के लिए प्लगइन परियोजना स्थापित करना

यह वास्तव में आसान हो रहा है रनिंग gradle install
आप स्थानीय रिपॉजिटरी डायरेक्टरी में जाकर इंस्टॉलेशन की जांच कर सकते हैं, जो आमतौर पर ~/.m2/repository पाया जाता ~/.m2/repository

ग्रेडल हमारे नए प्लगइन को कैसे खोजता है?

प्रत्येक Gradle plugin में एक id होती है जिसका उपयोग apply statement में किया जाता है। उदाहरण के लिए, बिल्ड फ़ाइल के लिए निम्नलिखित लिखकर, यह आईडी scala साथ प्लगइन को खोजने और लागू करने के लिए एक ट्रिगर टू ग्रैडल में अनुवाद करता है।

apply plugin: 'scala'

उसी तरह, हम अपने नए प्लगइन को निम्नलिखित तरीके से लागू करना चाहेंगे,

apply plugin: "com.btesila.scala.plugin"

इसका अर्थ है कि हमारे प्लगइन में com.btesila.scala.plugin id होगी।

इस आईडी को सेट करने के लिए, निम्न फ़ाइल जोड़ें:
src / मुख्य / संसाधन / META-INF / Gradle-प्लगइन / com.btesil.scala.plugin.properties

implementation-class=com.btesila.gradle.plugins.ScalaCustomPlugin

बाद में, फिर से gradle install

प्लगइन का उपयोग करना

  1. एक नया खाली ग्रेडल प्रोजेक्ट बनाएं और निम्न को बिल्ड फ़ाइल में जोड़ें
buildscript {
    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        //modify this path to match the installed plugin project in your local repository
        classpath 'com.btesila:working-with-gradle:1.0-SNAPSHOT'
    }
}

repositories {
    mavenLocal()
    mavenCentral()
}


apply plugin: "com.btesila.scala.plugin"

  1. gradle createDirs - आपको अब सभी सोर्स डायरेक्टरी जनरेट करनी चाहिए
  2. निर्माण फ़ाइल में इसे जोड़कर स्कैला संस्करण को ओवरराइड करें:
ext {
    scalaVersion.major = "2.11"
    scalaVersion.minor = "8"

}
println(project.ext.scalaVersion.major)
println(project.ext.scalaVersion.minor)
  1. एक निर्भरता लायब्रेरी जोड़ें जो स्केल संस्करण के साथ बाइनरी संगत है
dependencies {
    compile withScalaVersion("com.typesafe.scala-logging:scala-logging:3.5.0")
}

बस! अब आप एक ही पुराने बॉयलरप्लेट को दोहराए बिना अपनी सभी परियोजनाओं में इस प्लगइन का उपयोग कर सकते हैं।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow