Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions .github/workflows/call-publish-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ jobs:
strategy:
matrix:
target:
- ":build-logic:plugins:convention:publishToMavenLocal"
- ":build-logic:plugins:android:publishToMavenLocal"
- ":build-logic:plugins:minecraft:publishToMavenLocal"
- ":build-logic:convention:publishToMavenLocal"
- ":build-logic:property:publishToMavenLocal"
name: "Validate local publish"
runs-on: ubuntu-latest
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/call-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
- name: Run publish
uses: gradle/gradle-build-action@v3
with:
arguments: :build-logic:plugins:convention:publishAllPublicationsToMavenCentralRepository :build-logic:plugins:android:publishAllPublicationsToMavenCentralRepository :build-logic:plugins:minecraft:publishAllPublicationsToMavenCentralRepository --stacktrace
arguments: :build-logic:convention:publishAllPublicationsToMavenCentralRepository :build-logic:property:publishAllPublicationsToMavenCentralRepository --stacktrace
release:
needs: [ publish ]
name: Create GitHub release
Expand Down
35 changes: 35 additions & 0 deletions .github/workflows/release-mkdocs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Build and deploy material mkdocs to gh-pages
on:
push:
branches:
- master
workflow_dispatch:
jobs:
check_gradle_files_change:
name: "Check docs files changed"
runs-on: ubuntu-latest
outputs:
DOCS_FILES_CHANGED: ${{ steps.docs_changed.outputs.any_changed }}
steps:
- uses: actions/checkout@6d193bf28034eafb982f37bd894289fe649468fc # v4
with:
submodules: 'recursive'
- name: Check that docs changed
id: docs_changed
uses: tj-actions/changed-files@c3a1bb2c992d77180ae65be6ae6c166cf40f857c # v45.0.3
with:
files: |
docs/**
mkdocs.yml
deploy:
needs: [ check_gradle_files_change ]
if: needs.check_gradle_files_change.outputs.GRADLE_FILES_CHANGED == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: 3.x
- run: pip install mkdocs-material
- run: pip install mkdocs-minify-plugin
- run: mkdocs gh-deploy --force
76 changes: 49 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,83 +1,105 @@
![version](https://img.shields.io/maven-central/v/ru.astrainteractive.gradleplugin/convention?style=flat-square)
# Gradle Plugin Suite

## 🌟 Gradle Plugin Suite

A collection of useful, modular Gradle plugins — designed to keep your builds clean, focused, and flexible.

---

📘 For wiki: please navigate to [GitHub Pages](https://makeevrserg.github.io/gradle-plugin/)
A modular collection of Gradle plugins for Kotlin projects.

---

## 🔍 What Is This Project?
## What Is This Project

This **Gradle Plugin suite** is a modular build-logic plugins library for Kotlin projects. Instead of having one
monolithic plugin, it's split into sub-plugins to provide focused functionality:

- ⚙️ `convention` - basic utilities for any gradle-related project
- 📱 `android` - plugins and tasks for Android projects
- ⛏️ `minecraft` - plugins and tasks related for Minecraft development

This modular structure allows you to pick and use only the parts of the plugin you need, keeping your builds clean and
focused.
- `property` - property management system for `gradle.properties`, `local.properties`, and environment variables
- `convention` - core plugins for Java, Kotlin, Detekt, Dokka, publication, and more
- `android` - plugins for Android SDK, Compose, APK signing, namespacing
- `minecraft` - resource processor for Bukkit, Fabric, Forge, and Velocity

---

## 🚀 How to Use
## How to Use

### 1️⃣ Define the required plugins
### Define required plugins

In your `libs.version.toml`
In your `libs.versions.toml`

```toml
[versions]
# klibs
klibs-gradleplugin = "<latest-version>"

[plugins]
# Core
klibs-gradle-detekt = { id = "ru.astrainteractive.gradleplugin.detekt", version.ref = "klibs-gradleplugin" }
klibs-gradle-detekt-compose = { id = "ru.astrainteractive.gradleplugin.detekt.compose", version.ref = "klibs-gradleplugin" }
klibs-gradle-dokka-module = { id = "ru.astrainteractive.gradleplugin.dokka.module", version.ref = "klibs-gradleplugin" }
klibs-gradle-dokka-root = { id = "ru.astrainteractive.gradleplugin.dokka.root", version.ref = "klibs-gradleplugin" }
klibs-gradle-java-version = { id = "ru.astrainteractive.gradleplugin.java.version", version.ref = "klibs-gradleplugin" }
klibs-gradle-java-utf8 = { id = "ru.astrainteractive.gradleplugin.java.utf8", version.ref = "klibs-gradleplugin" }
klibs-gradle-rootinfo = { id = "ru.astrainteractive.gradleplugin.root.info", version.ref = "klibs-gradleplugin" }
klibs-gradle-rootinfo = { id = "ru.astrainteractive.gradleplugin.rootinfo", version.ref = "klibs-gradleplugin" }
klibs-gradle-publication = { id = "ru.astrainteractive.gradleplugin.publication", version.ref = "klibs-gradleplugin" }
# JavaScript
klibs-gradle-js-kobweb-resources = { id = "ru.astrainteractive.gradleplugin.js.kobweb.resources", version.ref = "klibs-gradleplugin" }
klibs-gradle-js-webpack-nosourcemaps = { id = "ru.astrainteractive.gradleplugin.js.webpack.nosourcemaps", version.ref = "klibs-gradleplugin" }
# Minecraft
klibs-gradle-minecraft-resource-processor = { id = "ru.astrainteractive.gradleplugin.minecraft.resource.processor", version.ref = "klibs-gradleplugin" }
# Android
klibs-gradle-android-java = { id = "ru.astrainteractive.gradleplugin.android.java", version.ref = "klibs-gradleplugin" }
klibs-gradle-android-sdk = { id = "ru.astrainteractive.gradleplugin.android.sdk", version.ref = "klibs-gradleplugin" }
klibs-gradle-android-namespace = { id = "ru.astrainteractive.gradleplugin.android.namespace", version.ref = "klibs-gradleplugin" }
klibs-gradle-android-compose = { id = "ru.astrainteractive.gradleplugin.android.compose", version.ref = "klibs-gradleplugin" }
klibs-gradle-android-apk-sign = { id = "ru.astrainteractive.gradleplugin.android.apk.sign", version.ref = "klibs-gradleplugin" }
klibs-gradle-android-apk-name = { id = "ru.astrainteractive.gradleplugin.android.apk.name", version.ref = "klibs-gradleplugin" }
# Minecrat
klibs-gradle-minecraft-resource-processor = { id = "ru.astrainteractive.gradleplugin.minecraft.resource-processor", version.ref = "klibs-gradleplugin" }
```

### 2️⃣ Set up your Gradle plugins
### Configure your `gradle.properties`

```properties
# Java
klibs.java.source=11
klibs.java.target=11
klibs.java.ktarget=11

# Project
klibs.project.name=MyProject
klibs.project.group=com.example.project
klibs.project.version.string=1.0.0
klibs.project.description=My project description
klibs.project.url=https://github.com/username/project
klibs.project.developers=username|Full Name|email@example.com
```

### Setup your gradle plugins

Your root `build.gradle.kts`

```kotlin
plugins {
// klibs - core
alias(libs.plugins.klibs.gradle.detekt) apply false
alias(libs.plugins.klibs.gradle.detekt.compose) apply false
alias(libs.plugins.klibs.gradle.dokka.module) apply false
alias(libs.plugins.klibs.gradle.dokka.root) apply false
alias(libs.plugins.klibs.gradle.java.version) apply false
alias(libs.plugins.klibs.gradle.java.utf8) apply false
alias(libs.plugins.klibs.gradle.rootinfo) apply false
alias(libs.plugins.klibs.gradle.publication) apply false
// klibs - javascript
alias(libs.plugins.klibs.gradle.js.kobweb.resources) apply false
alias(libs.plugins.klibs.gradle.js.webpack.nosourcemaps) apply false
// klibs - minecraft
alias(libs.plugins.klibs.gradle.minecraft.resource.processor) apply false
// klibs - android
alias(libs.plugins.klibs.gradle.android.java) apply false
alias(libs.plugins.klibs.gradle.android.sdk) apply false
alias(libs.plugins.klibs.gradle.android.namespace) apply false
alias(libs.plugins.klibs.gradle.android.compose) apply false
alias(libs.plugins.klibs.gradle.android.apk.sign) apply false
alias(libs.plugins.klibs.gradle.android.apk.name) apply false
// klibs - minecraft
alias(libs.plugins.klibs.gradle.minecraft.resource.processor) apply false
}
```

---

## Documentation

- [Convention Module](convention.md) - Core plugins, properties reference, tasks, and custom property access
- [Android Plugins](android.md) - Android SDK, Compose, signing, namespace, and APK naming plugins
- [Minecraft Plugins](minecraft.md) - Resource processor for Bukkit, Fabric, Forge, and Velocity
- [Property Module](property.md) - Property management system (`PropertyValue`, lookup order, caching)
18 changes: 10 additions & 8 deletions build-logic/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinBaseExtension
plugins {
`kotlin-dsl`
alias(libs.plugins.vaniktech) apply false
id("ru.astrainteractive.gradleplugin.detekt") version "1.13.2" apply true
id("ru.astrainteractive.gradleplugin.detekt") version "1.15.0" apply true
}

private fun requireProperty(key: String): String {
Expand All @@ -12,6 +12,12 @@ private fun requireProperty(key: String): String {
?: throw GradleException("Could not find property $key")
}

private fun canSignPublication(): Boolean {
val hasEnvMavenUsername = System.getenv("ORG_GRADLE_PROJECT_mavenCentralUsername") != null
val hasGradlePropertyUsername = providers.gradleProperty("mavenCentralUsername").isPresent
return hasEnvMavenUsername || hasGradlePropertyUsername
}

data class ProjectConfiguration(
val projectName: String = requireProperty("project.name"),
val projectDescription: String = requireProperty("project.description"),
Expand All @@ -32,12 +38,6 @@ allprojects {

subprojects {
val project = this
val whitelist = listOf(
"android",
"convention",
"minecraft",
)
if (!whitelist.contains(project.name)) return@subprojects
project.apply(plugin = "java-gradle-plugin")
project.apply(plugin = "com.vanniktech.maven.publish")

Expand Down Expand Up @@ -88,6 +88,8 @@ subprojects {
url.set(projectConfiguration.projectWeb)
}
}
signAllPublications()
if (canSignPublication()) {
signAllPublications()
}
}
}
143 changes: 143 additions & 0 deletions build-logic/convention/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
plugins {
`kotlin-dsl`
id("java-gradle-plugin")
id("com.vanniktech.maven.publish")
}

dependencies {
compileOnly(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
compileOnly(libs.android.gradle)
compileOnly(libs.kotlin.gradle)

implementation(libs.detekt.gradle)
implementation(libs.dokka.base)
implementation(libs.dokka.core)
implementation(libs.dokka.gradle)
implementation(libs.kobweb.gradle)
implementation(libs.vaniktech)
implementation(projects.buildLogic.property)
implementation(projects.property)
}

gradlePlugin {
website.set(projectWeb)
vcsUrl.set(projectWeb)
description = projectDescription
plugins {
create("detekt") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.detekt.DetektPlugin"
displayName = "Detekt Code Analysis Plugin"
description =
"Automatically applies detekt with KLibs configuration for static code analysis with Kotlin linting rules"
tags.set(listOf("kotlin", "static-analysis", "klibs"))
}
create("dokka.module") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.dokka.DokkaModulePlugin"
displayName = "Dokka Module Documentation Plugin"
description =
"Configures Dokka for individual modules with JDK version detection and documentation settings"
tags.set(listOf("documentation", "kotlin", "klibs"))
}
create("dokka.root") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.dokka.DokkaRootPlugin"
displayName = "Dokka Root Documentation Plugin"
description = "Configures Dokka multi-module documentation generation for root projects"
tags.set(listOf("documentation", "kotlin", "klibs"))
}
create("java.version") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.JavaVersionPlugin"
displayName = "Java Version Configuration Plugin"
description = "Sets Java source/target compatibility and Kotlin JVM target versions from project properties"
tags.set(listOf("java", "kotlin", "klibs"))
}
create("java.utf8") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.JavaUtf8Plugin"
displayName = "Java UTF-8 Encoding Plugin"
description = "Configures UTF-8 encoding for Java compilation tasks"
tags.set(listOf("java", "encoding", "klibs"))
}
create("rootinfo") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.ModuleInfoPlugin"
displayName = "Module Info Plugin"
description = "Applies project group, version, and description from gradle.properties to root project"
tags.set(listOf("configuration", "klibs"))
}
create("publication") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.PublicationPlugin"
displayName = "Maven Publication Plugin"
description = "Configures Maven Central publication with POM metadata from project properties"
tags.set(listOf("publication", "maven", "klibs"))
}
create("js.kobweb.resources") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.KobwebResourcesPlugin"
displayName = "Kobweb JavaScript Resources Plugin"
description = "Manages JavaScript resources copying for Kobweb applications"
tags.set(listOf("javascript", "kobweb", "klibs"))
}
create("js.webpack.nosourcemaps") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.WebpackNoSourceMapsPlugin"
displayName = "Webpack No Source Maps Plugin"
description = "Disables source maps in Kotlin/JS Webpack builds for production optimization"
tags.set(listOf("javascript", "webpack", "klibs"))
}
create("minecraft.resource.processor") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.ResourceProcessorPlugin"
displayName = "Minecraft Resource Processor Plugin"
description = "Provides resource processor scope for Minecraft mod development"
tags.set(listOf("minecraft", "resources", "klibs"))
}
create("android.java") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.AndroidJavaPlugin"
displayName = "Android Java Configuration Plugin"
description =
"Configures Java/Kotlin JVM target versions for Android and Kotlin Multiplatform Android targets"
tags.set(listOf("android", "java", "kotlin", "klibs"))
}
create("android.sdk") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.AndroidSdkPlugin"
displayName = "Android SDK Configuration Plugin"
description = "Sets compileSdk, minSdk, and targetSdk versions for Android projects from gradle.properties"
tags.set(listOf("android", "sdk", "klibs"))
}
create("android.namespace") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.AndroidNamespacePlugin"
displayName = "Android Namespace Plugin"
description = "Automatically generates Android namespace based on module path hierarchy"
tags.set(listOf("android", "configuration", "klibs"))
}
create("android.compose") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.AndroidComposePlugin"
displayName = "Android Compose Plugin"
description = "Enables and configures Jetpack Compose for Android projects"
tags.set(listOf("android", "compose", "klibs"))
}
create("android.apk.sign") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.ApkSigningPlugin"
displayName = "Android APK Signing Plugin"
description = "Configures APK signing for debug and release builds using keystore from gradle properties"
tags.set(listOf("android", "signing", "klibs"))
}
create("android.apk.name") {
id = "$projectGroup.$name"
implementationClass = "$projectGroup.plugin.ApkNamePlugin"
displayName = "Android APK Naming Plugin"
description = "Automatically names APK files with project name, version, and build variant"
tags.set(listOf("android", "apk", "klibs"))
}
}
}
Loading
Loading