Sommaire

सॉफ्टवेयर प्रोजेक्ट के लिए बिल्ड कार्यों का स्वचालन महत्वपूर्ण है, और Gradle, अपने Kotlin DSL के साथ, असाधारण लचीलापन प्रदान करता है। हमारी बातचीत के दौरान, हमने बिल्ड लॉजिक को केंद्रीकृत और पुनः उपयोग करने के तरीकों का पता लगाया, विशेष रूप से टेस्ट रिपोर्ट के लिए, का लाभ उठाते हुएसभी परियोजनाएँ, बिल्डSrc, और Kotlin में कस्टम कार्य

allprojects` और subprojects के साथ Configurations को केंद्रीकृत करें

ब्लॉक`allprojects` et `subprojects`आपके`build.gradle.kts`जड़ आपके मल्टी-मॉड्यूल प्रोजेक्ट में सामान्य कॉन्फ़िगरेशन लागू करने के लिए बुनियादी है।

*allprojects { …​ }`कॉन्फ़िगरेशन लागू करेंमूल परियोजना और इसकी सभी उप-परियोजनाओं के लिए। परिभाषित करने के लिए आदर्श`group, एक`version`, या कुछ`repositories`सामान्य (No output)subprojects { …​ }`कॉन्फ़िगरेशन लागू करेंकेवल उप-परियोजनाओं तक, मूल परियोजना को छोड़कर. परफेक्ट मॉड्यूल-विशिष्ट प्लगिन लागू करने के लिए (जैसे`java ou kotlin-jvm) या आपकी लाइब्रेरी के सामान्य निर्भरताएँ।

यहाँ एक उदाहरणात्मक उदाहरण :

// build.gradle.kts (projet racine)
plugins {
    base // Appliqué au projet racine
}

allprojects {
    group = "com.example"
    version = "1.0.0"

    repositories {
        mavenCentral()
    }

    tasks.withType<org.gradle.api.tasks.testing.Test> {
        useJUnitPlatform() // Configuration commune des tests pour tous les projets
    }
}

subprojects {
    apply(plugin = "java")
    apply(plugin = "org.jetbrains.kotlin.jvm")

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    }

}

\==`buildSrc`बिल्ड तर्क का स्विस आर्मी चाकू

जब आपके कार्यों की तर्क जटिल हो जाती है या इसे पुनः उपयोग में लाने की आवश्यकता होती है,buildSrcयह प्राथमिक समाधान है। यह एक विशेष Gradle मॉड्यूल है जो मुख्य बिल्ड स्क्रिप्ट्स से पहले संकलित किया जाता है, जिससे इसकी क्लासेस आपके बिल्ड के पूरे क्लासपाथ पर उपलब्ध हो जाती हैं।

\=== क्यों उपयोग करें`buildSrc`कार्यों के लिए ?

  • पुन: उपयोगिताएक परिभाषित कार्य में`buildSrc`इस बिल्ड के किसी भी प्रोजेक्ट में लागू किया जा सकता है।

  • संगठन: बिल्ड कोड को सेंट्रलाइज़ करें, जिससे यह अधिक साफ़ और रखरखाव योग्य हो।

  • टाइप सुरक्षा और ऑटो‑कम्प्लीशन: कोटलिन कोड में`buildSrc`इसे संकलित किया जाता है, जो आपके IDE में त्रुटि जाँच और स्वत पूर्णता प्रदान करता है, विकास अनुभव को बेहतर बनाता है।

\=== प्रवाह आरेख`buildSrc`(कोड PlantUML)

इस आरेख को उत्पन्न करने के लिए, नीचे दिया गया कोड कॉपी करें और PlantUML समर्थन करने वाले टूल में पेस्ट करें।

[source,plantuml]

@startuml skinparam handwritten true skinparam monochrome true

ग्रैडल एकीकरण JBake को JBake Gradle प्लगिन का उपयोग करके या JBake CLI को सीधे बुलाकर Gradle बिल्ड्स में एकीकृत किया जा सकता है:

----
tasks.register<JavaExec>("bake") {
    mainClass.set("org.jbake.launcher.Main")
    classpath = configurations["jbake"]
    args = listOf(projectDir.absolutePath, "$buildDir/jbake")
}
----

rectangle "ग्रैडल बिल्ड प्रक्रिया घटक "buildSrc" जैसे BS { फ़ाइल "MyCustomTask.kt" के रूप में T फ़ाइल "MyConventionPlugin.kt" के रूप में P } घटक "Root Project" के रूप में RP घटक "Subproject A" के रूप में SA घटक "Subproject B" को SB के रूप में }

T --\> P : "is defined in" P --> RP : "इस पर लागू किया जाता है P --> SA : "लागू किया जाता है P --\> SB : "लागू किया जाता है

RP --|\> SA : "शामिल RP --|\> SB : "शामिल

RP -up-> BS : \"निर्भर करता है (बिल्ड लॉजिक के लिए)\ SA -up-> BS : "निर्माण तर्क के लिए (निर्भर करता है) SB -up-> BS : "निर्भर करता है (बिल्ड तर्क के लिए)

T के दाएँ ओर नोट कस्टम टास्क वर्ग (उदाहरण: OpenTestReportTask) end note

पी के दाएँ नोट कॉन्वेंशन प्लगइन वे कार्यों को दर्ज करते हैं end note

## @enduml

\== अभिव्यक्त रिपोर्ट कार्यों का निर्माण

टेस्ट रिपोर्ट्स को संभालने के लिए, हमने एक मॉड्यूलर दृष्टिकोण तैयार किया एक अमूर्त कार्य क्लास का उपयोग करके में`buildSrc`. आपकी आवश्यकताओं के अनुसार, यह वर्ग से विरासत में ले सकता है`DefaultTask` ou de `Exec`.

\=== अमूर्त कार्य`OpenTestReportTask`(से विरासत में प्राप्त`DefaultTask`)

यदि आपको फ़ाइल सिस्टम या अन्य Gradle API के साथ बातचीत करने वाली कस्टम Kotlin तर्क चाहिए, और फिर बाहरी कमांड चलाने की आवश्यकता हो, तो इस दृष्टिकोण की सिफारिश की जाती है।

## [source,kotlin]

package com.yourpackage

आयात org.gradle.api.DefaultTask आयात org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction import java.io.File

abstract class OpenTestReportTask : DefaultTask() {

init { group = "verification" description = "Opens a test report in Firefox." dependsOn("check") // Assure que les rapports sont générés }

@get:Input abstract var reportPath: String

@TaskAction fun openReport() { val separator = File.separator val reportFile = project.layout.projectDirectory.asFile.toPath() .resolve(reportPath.replace("/", separator)) .toAbsolutePath() .toFile()

if (!reportFile.exists()) {
    logger.warn("Report file does not exist: $reportFile. Ensure 'check' ran.")
    return
}
    project.exec {
        commandLine("firefox", "--new-tab", reportFile.absolutePath)
    }
    logger.lifecycle("Opened test report: ${reportFile.absolutePath}")
}
## }

\=== वास्तविक कार्यान्वयन

ये क्लासेस अमूर्त कार्य से विरासत में लेती हैं और रिपोर्ट के विशिष्ट पथ को परिभाषित करती हैं।

## [source,kotlin]

पैकेज com.yourpackage

अमूर्त वर्ग ReportUnitTestsTask : OpenTestReportTask() { init { description = "फ़ायरफ़ॉक्स में यूनिट परीक्षण रिपोर्ट खोलता है। reportPath = "build/reports/tests/test/index.html } }

package com.yourpackage

= मेरा ब्लॉग पोस्ट शीर्षक
2026-01-15
:jbake-title: मेरा ब्लॉग पोस्ट शीर्षक
:jbake-tags: java, gradle, ट्यूटोरियल
:jbake-type: पोस्ट
:jbake-status: प्रकाशित
:jbake-date: 2026-01-15
:jbake-summary: पोस्ट का संक्षिप्त सारांश
:jbake-author: लेखक का नाम
:jbake-description: SEO के लिए मेटा विवरण
:jbake-slug: my-blog-post-slug
:jbake-reading-time: 5 मिनट
:imagesdir: ./images
:source-highlighter: highlight.js
:icons: फ़ॉन्ट
:toc: बाएँ
:toclevels: 3
:toc-title: सामग्री की तालिका

### JBake CLI आदेश

Initialize a new JBake project jbake -i

Bake (generate) the site jbake -b

Bake and serve locally jbake -b -s

Bake and watch for changes jbake -b --reset

Specify source and destination jbake source_folder output_folder

Clear the output directory before baking jbake -b . output --reset `

Gradle एकीकरण JBake को Gradle निर्माण में JBake Gradle प्लगइन का उपयोग करके या JBake CLI को सीधे बुलाकर एकीकृत किया जा सकता है: kotlin tasks.register<JavaExec>("bake") { mainClass.set("org.jbake.launcher.Main") classpath = configurations["jbake"] args = listOf(projectDir.absolutePath, "$buildDir/jbake") }

abstract class ReportFunctionalTestsTask : OpenTestReportTask() { init { description = "फ़ायरफ़ॉक्स में फंक्शनल टेस्ट रिपोर्ट खोलता है।" reportPath = "build/reports/tests/functionalTest/index.html" } }

\=== कार्यों का अभिलेख

में`build.gradle.kts`आपके मूल प्रोजेक्ट :

[source,kotlin]

tasks.register\<com.yourpackage.ReportUnitTestsTask\>("reportTests") {} tasks.register\<com.yourpackage.ReportFunctionalTestsTask\>("reportFunctionalTests") {}

रिपोर्ट कार्यों का UML आरेख (कोड PlantUML)

नीचे दिया गया कोड कॉपी करें और इसे PlantUML को समर्थन करने वाले उपकरण में पेस्ट करें।

[source,plantuml]

@startuml skinparam handwritten true skinparam monochrome true

abstract class DefaultTask { }

abstract class Exec { \+ commandLine(args: String…​) \+ exec() }

abstract class OpenTestReportTask extends DefaultTask { \+ group: String = "verification \+ description: String \+ dependsOn("check") \+ abstract reportPath: String \+ openReport() : void }

अमूर्त वर्ग AbstractJbakeExecTask Exec को विस्तारित करता है { \+ group: String = "verification \+ विवरण: स्ट्रिंग \+ dependsOn("check") \+ abstract reportRelativePath: String \+ exec() : void }

class ReportUnitTestsTask extends OpenTestReportTask { \+ reportPath: String = "build/reports/tests/test/index.html }

क्लास ReportFunctionalTestsTask विस्तार OpenTestReportTask { \+ reportPath: String = "build/reports/tests/functionalTest/index.html }

class ReportJbakeTestsTask extends AbstractJbakeExecTask { + reportRelativePath: String = "build/reports/tests/test/index.html }

class ReportJbakeFunctionalTestsTask extends AbstractJbakeExecTask { \+ reportRelativePath: String = "build/reports/tests/functionalTest/index.html }

OpenTestReportTask <-- ReportUnitTestsTask OpenTestReportTask <-- ReportFunctionalTestsTask

AbstractJbakeExecTask <-- ReportJbakeTestsTask AbstractJbakeExecTask <-- ReportJbakeFunctionalTestsTask

DefaultTask \<|-- OpenTestReportTask Exec \<|-- AbstractJbakeExecTask # ग्रेडल एकीकरण JBake को JBake ग्रेडल प्लगइन का उपयोग करके या JBake सीएलआई को सीधे बुलाकर ग्रेडल बिल्ड में एकीकृत किया जा सकता है: ```kotlin tasks.register<JavaExec>("bake") { mainClass.set("org.jbake.launcher.Main") classpath = configurations["jbake"] args = listOf(projectDir.absolutePath, "$buildDir/jbake") }

@enduml

अमूर्त कार्य`AbstractJbakeExecTask`(विरासत प्राप्त`Exec`)

यदि आपका कार्य मुख्य रूप से परिवर्तनीय तर्कों के साथ एक बाहरी कमांड निष्पादित करने तक सीमित है, तो सीधे से विरासत में लेना**# ग्रेडल एकीकरण JBake को Gradle बिल्ड में JBake Gradle प्लगइन का उपयोग करके या JBake CLI को सीधे बुलाकर एकीकृत किया जा सकता है:

----
tasks.register<JavaExec>("bake") {
    mainClass.set("org.jbake.launcher.Main")
    classpath = configurations["jbake"]
    args = listOf(projectDir.absolutePath, "$buildDir/jbake")
}**यह अधिक सीधा है।

## [source,kotlin]

package com.yourpackage

import org.gradle.api.tasks.Exec import org.gradle.api.tasks.Input import java.io.File

अमूर्त वर्ग AbstractJbakeExecTask : Exec() {

----

init { group = "verification" description = "Opens a Jbake project report in Firefox." dependsOn("check") }

@get:Input abstract var reportRelativePath: String

override fun exec() { val separator = File.separator val reportFile = project.layout.projectDirectory.asFile.toPath() .resolve(reportRelativePath.replace("/", separator)) .toAbsolutePath() .toFile()

if (!reportFile.exists()) { logger.warn("Report file does not exist: $reportFile. Ensure 'check' ran.") return }

commandLine("firefox", "--new-tab", reportFile.absolutePath) logger.lifecycle("Attempting to open report: ${reportFile.absolutePath}") super.exec() // Appelle la méthode exec() de la super-classe Exec }

## }

\=== ठोस कार्यान्वयन के लिए`Exec`

## [source,kotlin]

package com.yourpackage

अमूर्त वर्ग ReportJbakeTestsTask : AbstractJbakeExecTask() init { फ़ायरफ़ॉक्स में Jbake यूनिट टेस्ट रिपोर्ट खोलता है। reportRelativePath = "build/reports/tests/test/index.html } }

package com.yourpackage

## abstract class ReportJbakeFunctionalTestsTask : AbstractJbakeExecTask() { init { description = "फ़ायरफ़ॉक्स में फ़ंक्शनल टेस्ट रिपोर्ट खोलता है।" reportRelativePath = "build/reports/tests/functionalTest/index.html" } }

\== कार्यों की दृश्यता`buildSrc`

आप जो कार्य और वर्ग परिभाषित करते हैं**buildSrc**हैं :

***दृश्य और उपयोगी**आपके मुख्य बिल्ड के सभी प्रोजेक्ट्स (रूट और सब-प्रोजेक्ट्स)। इसलिए आप उपयोग कर सकते हैं`com.yourpackage.ReportUnitTestsTask`में`allprojects { ... }`. ***गैर-निष्पाद्य**सीधे buildSrc कार्यों के रूप में (उदाहरण के लिए,`gradle :buildSrc:reportTests`यदि कार्य को विशिष्ट रूप से में दर्ज नहीं किया गया है तो यह काम नहीं करेगा`buildSrc/build.gradle.kts`).`buildSrc`यह एक संकलन मॉड्यूल है, एक निष्पादन योग्य एप्लिकेशन मॉड्यूल नहीं, इन मुख्य बिल्ड कार्यों के लिए।

\=== परीक्षणों के लिए एक रिपोर्ट चलाएँ`buildSrc`खुद

Si `buildSrc`अपने स्वयं के परीक्षण होते हैं और यह रिपोर्ट उत्पन्न करता है, आप रिपोर्ट कार्य को सीधे में दर्ज कर सकते हैं`buildSrc/build.gradle.kts`(Empty)

## [source,kotlin]

प्लगइंस { `kotlin-jvm` आप एक पेशेवर अनुवादक हैं। fr से hi तक अनुवाद करें। सभी बैकटिक कोड स्पैन (`...`) को ठीक वैसे ही संरक्षित रखें — कभी भी बैकटिक की सामग्री, अंतराल या स्थिति को न बदलें। यह पाठ किसी बड़े वाक्य का अंश हो सकता है — अतिरिक्त संदर्भ मांगे बिना उस अंश का अनुवाद करें। केवल अनुवादित पाठ आउटपुट करें — कोई स्पष्टीकरण, कोई टिप्पणी, कोई परिचय, कोई विकल्प, कोई विकल्प नहीं।

repositories { mavenCentral() }

tasks.withType\<Test\> { useJUnitPlatform() reports.html.outputLocation.set(layout.buildDirectory.dir("reports/tests")) }

import com.yourpackage.ReportJbakeTestsTask // अपनी टास्क क्लास आयात करें

tasks.register<ReportJbakeTestsTask>("reportBuildSrcTests") { // पथ क्लास में पहले से परिभाषित है, यह buildSrc रिपोर्ट्स की ओर इशारा करेगा }

आप फिर इसे निष्पादित कर सकते हैं:`./gradlew :buildSrc:test`के बाद`./gradlew :buildSrc:reportBuildSrcTests`.

इन प्रथाओं को अपनाने से, आप Kotlin DSL में Gradle बिल्ड सिस्टम बनाएँगे जो न केवल शक्तिशाली होंगे, बल्कि अविश्वसनीय रूप से मॉड्यूलर, बनाए रखने में आसान और समझने में सरल भी होंगे।

संबंधित लेख