Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

GradleGradleGradleLicence

Logo

An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

I saw plenty of plugins that require a long configuration and continuous adjustment just to update those numbers, if so, better without any plugin then! With this plugin we are required to manage only 2 variables.

Inspired from Android Studio Automatic Incremental Gradle Versioning. Customized into a plugin with PreRelease, Auto-Reset and Sub-Modules features.

💬 Easy to apply, it works with any project type with sub modules too.

Rules

User values

major: Required, user defined value for breaking changes.
minor: Required, user defined value for new features, but backwards compatible. If you increase Major version, this value must be coherent(=0).
patch: Optional, user defined value (or auto-generated value) for backwards compatible bug fixes only.
preRelease: Optional, user defined value for pre-releases suffix.
incrementBuild: Optional, set to false to disable build number auto-increment during development (default: true).
incrementOn: Optional, custom task name to trigger the increase of the version and save. By default, any assemble*Release, bundle*Release (including flavors) and grabverRelease are already detected.

Calculation

patch - If not specified by user, increases at each release, but it auto resets back to 0 when Minor or Major version changes or if preRelease is set.
build - Increases at each build.
code - Increases at each release.

Installation

Configure pluginManagement in settings.gradle file:

pluginManagement {
repositories {
gradlePluginPortal()
}
plugins {
id "eu.davidea.grabver" version "2.1.0"
}
}

Configure build script in each build.gradle file:

plugins {
id "eu.davidea.grabver"
}

Usage

1. Version configuration

Apply the plugin in the module you desire, it will create a version.properties file under that module!

plugins {
...
id 'eu.davidea.grabver'
}
versioning {
// Required (number)
major 1
minor 0// Optional, force custom patch (number)
patch 7// Optional (any string)
preRelease "RC1"// Optional, disable build number increment during development (default: true)
incrementBuild false
// Optional, custom task name to trigger the increase of the version and save
incrementOn "<task-name>"
}

💬 Note: The file version.properties is auto-generated, but once it's created, you can modify its content as of your convenience. Just remember to add it to your Version Control System (from time to time).

2. Grab your new version

versioning.major
versioning.minor
versioning.patch
versioning.build
versioning.preRelease
versioning.code // auto-incremental integer, needed for all Android Apps
versioning.name // output: "major.minor.patch[-preRelease]"
versioning.fullName // output: "major.minor.patch[-preRelease] #buildNr built on yyyy.MM.dd"
versioning.builtOn // output: " built on yyyy.MM.dd"
versioning.date // or versioning.getDate([format]) - default "yyyy.MM.dd"// Example: grab the version name
version = versioning.name

⚠️Note: To trigger the evaluation, user must grab one of majorminorpatchbuildcodenamefullName attribute!

3. Run it

Via command line:

/**
* Debug: increments build number only.
* Code and Patch remain unchanged.
*/
gradle [build | jar | war | explodedWar]
/**
* Release: increments build, patch and code.
* - Code is incremented if a release task is invoked.
* - Patch may be reset if Major or Minor changed or if preRelease is set.
*/
gradle [grabverRelease]

Android

The plugin recognizes Android tasks including product flavors:

gradle [assembleDebug | bundleDebug | assembleFlavorDebug | bundleFlavorDebug]
gradle [assembleRelease | bundleRelease | assembleFlavorRelease | bundleFlavorRelease]

In Android Studio:

  • Build > Generate Bundle / APK (assembleDebug | bundleDebug)
  • Build > Generate Signed Bundle / APK (assembleRelease | bundleRelease)
  • Run the App (assembleDebug | assembleRelease, depending on the build variant)

Silent mode

The plugin evaluates the run tasks in silent mode to automatically skip the version evaluation and to not print unnecessary logs if no relevant task was detected. A single log line is however produced.
Single tasks such as clean, test, flyway and all third-party plugin tasks will not trigger the versioning evaluation. Default tasks defined via defaultTasks are also evaluated together with command line tasks. Example:

CommandOutcome
gradle clean testEvaluation skipped
gradle javadocEvaluation skipped
gradle flywayCleanEvaluation skipped
gradle clean buildEvaluation triggered and new values saved
gradle clean war grabverReleaseEvaluation triggered, versioning increased and new values saved
defaultTasks('build') + gradleEvaluation triggered via default tasks

4. Control Build Number Increment

By default, the build number increments on every build. To avoid constant version.properties changes during development (useful for Git workflows), disable it:

versioning {
major 1
minor 2
incrementBuild false
}

Scenarios (when flag=false):

  • Debug builds → Build number unchanged → File not saved
  • Release builds → Code/patch/build increment → File saved
  • Manual version changes (major/minor/patch/preRelease) → File saved

💡 Tip: Toggle incrementBuild based on your workflow needs.

Changelog

See CHANGELOG.md for all notable changes.

Contributions

Everybody is welcome to improve existing solution. Many features and bug fixes already come from user requests - don't hesitate to open an issue, even if it may take some time to address.

💬 Note: Unit tests work fine if you open the project with IntelliJ Idea, while with Android Studio they don't. Alternatively, you can simulate a real build script by running gradlew publishToMavenLocal and gradlew -b build-test.gradle build [<release task>] OR testing within modules_a/b gradlew build [<release task>].
Additional instructions inside build-test.gradle.

License

Copyright 2017-2026 Davidea Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

Gradle Automatic Build Versioning Plugin - An easy Gradle plugin that follows semver.org rules to automatically generate the Patch version, Build number and Code version, while Major, Minor and Pre-Release suffix remain under our control.

Topics

Resources

Stars

42 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages