Gradle feature parity
If you are deciding whether to move off Gradle, the question is what can’t I do? This page lists Gradle features by area with their status in Kargo. To move a project, see Migrating from Gradle.
| Status | Meaning |
|---|---|
| Supported | Kargo does it, in the same way or close to it. |
| Different | Kargo covers the need another way. The row says how. |
| Planned | Not there yet; the issue number tracks it. |
| Not planned | Kargo leaves it out on purpose. The row says why. |
| Gap | Not there, and no issue is open yet. |
Mindset differences
Section titled “Mindset differences”- One package per
kargo.toml. There is nosettings.gradle.ktsplus a script per module. A workspace lists member packages, and members inherit shared settings and dependencies with{ workspace = true }. - No scripting language in the build.
kargo.tomlis data. There is nobuild.gradle.ktsto compute things in, noafterEvaluate, noallprojects {}. Behavior that Gradle gets from a script comes from frameworks,[[generate]]steps or tasks. - Tasks are Kotlin scripts or shell commands, plugins are scripts or executables. A task is a script or a command in
[tasks]that you can run withkargo <task>or attach to a hook, a hook plugin is a script or a program, and a subcommand is a program calledkargo-<name>. There is no task graph API and no plugin classpath. See Tasks, hooks and plugins. - Fixed lifecycle and layout.
build,check,run,testandpackagealways exist, and sources live insrc/,tests/andresources/(see Project layout). - Android still uses Gradle underneath, but Kargo writes the Gradle project from your
kargo.toml.
Dependencies
Section titled “Dependencies”| Gradle feature | Status | In Kargo |
|---|---|---|
| Maven repositories, POM inheritance, BOMs, exclusions, ranges, relocations | Supported | Dependencies |
| Gradle module metadata (Kotlin Multiplatform variants) | Supported | Resolved per target; see Multiplatform |
Conflict resolution (highest wins, strictly) |
Supported | Highest wins, force = true overrides; see Version conflicts |
Platforms (platform(...)) |
Supported | BOMs |
Dependency constraints in your own build (constraints {}) |
Different | Declare the module yourself at the version you want, or with force = true. Constraints published by libraries are honored |
Dependency insight (dependencyInsight) |
Supported | kargo why, kargo tree --invert |
Dependency tree (dependencies) |
Supported | kargo tree |
Version catalogs (libs.versions.toml) |
Different | kargo import reads them. In a project, share versions with [workspace.dependencies] |
| Dependency locking | Supported | kargo.lock is always on and pins the SHA-256 of every artifact; see the lockfile |
Dependency verification (verification-metadata.xml) |
Supported | The checksums in kargo.lock; --locked fails when they would change |
| Dependency updates (Versions plugin) | Supported | kargo outdated, kargo upgrade |
| Vulnerability scanning (Dependency-Check) | Supported | kargo audit |
| Repository content filtering | Supported | include-groups and exclude-groups; see Choosing which repository serves a library |
SNAPSHOT versions, mavenLocal() |
Supported | SNAPSHOT versions |
Dependency substitution (substitute, dependencySubstitution) |
Gap | Use a path dependency or force = true on another version |
| Capabilities and capability conflicts | Gap | |
| Dependency exclusions | Supported | exclude on a dependency |
| Custom configurations | Not planned | Kargo has fixed scopes (compile, runtime, provided, processor, ksp), because configurations are build-script code |
| SBOM generation | Gap | kargo tree --format json and kargo metadata give the data |
| Gradle feature | Status | In Kargo |
|---|---|---|
| Incremental Kotlin compilation | Supported | Incremental compilation for the JVM |
| Compiler daemon | Supported | The compiler daemon |
| Parallel builds | Supported | Always on; -j limits workspace members. See Parallel work |
| Up-to-date checks | Supported | Skipped work |
| Local build cache | Different | Each compilation fingerprints its inputs and is skipped when unchanged; target/ is not shared between checkouts |
| Remote build cache | Gap | |
| Configuration cache, build scans | Not planned | There is no configuration phase to cache, since kargo.toml is data |
Composite builds (includeBuild) |
Different | Path dependencies and workspaces; see Local packages |
| Multi-project builds | Supported | Workspaces |
Init scripts, buildSrc, convention plugins |
Not planned | There is no build scripting. Share settings with [workspace.*] tables |
| Custom tasks and task dependencies | Different | [tasks] and hooks, written as Kotlin scripts or shell commands |
| Custom plugins in Kotlin or Groovy | Different | A hook plugin is a Kotlin script or an executable, and a subcommand is an executable named kargo-<name>. There is no plugin classpath |
Toolchains (jvmToolchain) |
Supported | [toolchain] jdk; see Toolchains |
Wrapper (gradlew) |
Different | [toolchain] kargo sets the minimum Kargo version, and kargo self update updates it |
| Offline mode, mirrors, proxies | Supported | Offline builds and mirrors, kargo vendor |
| Build profiles and environments | Supported | [profile.<name>], [env] |
| Code generation | Supported | [[generate]] |
Watch mode (--continuous) |
Supported | kargo watch, run --watch, test --watch |
| Hot reload | Partial | kargo run --hot swaps changed classes into a running JVM program or server and recomposes Compose Desktop (#231, #220). Wasm and JS browser apps reload their page with --watch. Spring Boot DevTools and Ktor autoreload are not wired in |
Kotlin
Section titled “Kotlin”| Gradle feature | Status | In Kargo |
|---|---|---|
| JVM, Wasm, JS and Native targets | Supported | Targets |
| Android | Different | Generated Gradle project under target/android; see Android |
| Multiplatform source sets | Different | src/, src-jvm/, src-wasm/, src-js/, src-native/, src-android/, and intermediate sets of several targets (src-jvmAndAndroid/) declared with [source-sets.<name>]. Sets of some Native platforms (appleMain, linuxMain) with platforms. See Source sets for several targets |
| Compiler arguments, opt-in, language and API version | Supported | [kotlin] |
| Warnings as errors | Supported | warnings-as-errors = true |
| Compiler plugins (serialization, allopen, noarg, compose, …) | Supported | [frameworks] and [plugins.<name>] |
| Annotation processing (kapt) | Different | Java processors with scope = "processor"; see Annotation processors |
| KSP | Supported | scope = "ksp"; see KSP |
| Explicit API mode | Different | compiler-args = ["-Xexplicit-api=strict"] |
| Binary compatibility validator | Gap | |
| C interop | Supported | C interop |
| Cross-compiling Native for Apple targets | Different | Needs macOS, as with Gradle; see Native |
| Shared Android and multiplatform code, XCFramework | Supported | A shared module for apps, Android libraries, XCFrameworks |
| CocoaPods and Swift Package Manager output | Supported | kargo build --xcframework --swift-package --cocoapods; see Swift Package Manager and CocoaPods. A CocoaPods plugin that builds the framework from Xcode (embedAndSignAppleFrameworkForXcode) is not there |
Testing
Section titled “Testing”| Gradle feature | Status | In Kargo |
|---|---|---|
| Running tests, filters, tags, timeouts | Supported | Testing |
| JUnit XML and JSON reports | Supported | Test reports for CI |
| Re-running failed tests | Supported | kargo test --failed; see Rerunning failures |
Retry plugin (org.gradle.test-retry) |
Gap | Rerun failures with --failed |
Test suites (jvm-test-suite, separate integration tests) |
Supported | [test.suites.<name>], kargo test --suite <name> |
| Code coverage (JaCoCo) | Supported | kargo test --coverage |
| Test fixtures | Supported | Test fixtures |
| Benchmarks (kotlinx-benchmark, JMH) | Supported | kargo bench |
| Android local and instrumented tests | Planned | #221. kargo android connectedAndroidTest runs them today |
Packaging and publishing
Section titled “Packaging and publishing”| Gradle feature | Status | In Kargo |
|---|---|---|
| Executable and fat jars | Supported | kargo package; see Distributing |
Application distribution (installDist, distZip, distTar) |
Supported | kargo package --dist; see Distribution archives. A bundled JDK and kargo publish attaching the archive are not done yet (#222) |
| jlink and jpackage | Supported | --format jlink, --format installer |
| GraalVM native image | Supported | --format native-image |
Shadow relocation, resource merging, minimize() |
Supported | [package.shade] |
| ProGuard and R8 | Supported | [package.optimize] |
| Docker and OCI images (Jib) | Planned | #223 |
maven-publish and signing |
Supported | kargo publish |
| Maven Central Portal | Supported | kargo publish |
Publishing extras: java-platform BOMs, in-memory PGP keys, repository presets, relocation POMs, idempotent re-publishing |
Supported | BOMs, Signing, Hosted repositories; S3 repositories are a gap (#224) |
| Dokka | Supported | kargo doc |
| Installing tools from Maven or git | Supported | kargo install |
Android
Section titled “Android”| Gradle feature | Status | In Kargo |
|---|---|---|
| Application and library modules | Supported | Android |
| Product flavors, build config fields | Supported | Product flavors |
| Devices and emulators | Supported | kargo run -t android, kargo devices, kargo android |
| Android SDK management | Supported | kargo toolchain install android-sdk |
| Any Gradle task | Supported | kargo android <gradle args> |
| Android lint, baselines and SARIF reports | Supported | Lint |
App Bundles (.aab) |
Supported | kargo package -t android (Release builds) |
NDK, CMake, ndk-build, prebuilt .so libraries |
Supported | Native code |
| Manifest placeholders, resource locale filters | Supported | Manifest placeholders, Resources |
| Custom build types, baseline profiles, macrobenchmarks, Play uploads | Planned | #228 |
| Hand-written Gradle files | Not planned | Kargo generates the Gradle project; put the settings in kargo.toml |
IDE support and CI
Section titled “IDE support and CI”| Gradle feature | Status | In Kargo |
|---|---|---|
| IntelliJ IDEA and Android Studio | Supported | The Kargo plugin; see Editors. Gradle import is not used |
| VS Code, Zed, Neovim, Emacs | Supported | Editors, kargo lsp, kargo dap |
| Tooling API | Different | kargo metadata and --message-format json |
| CI setup | Supported | kargo init-ci, --locked |
| Importing an existing build | Supported | kargo import. It reads the scripts without running Gradle (#279 tracks reading them by running Gradle) |
Converting a Gradle plugin
Section titled “Converting a Gradle plugin”| Gradle plugin | In Kargo |
|---|---|
Shadow (shadowJar) |
kargo package (--fat for a library) with [package.shade] for relocate, exclude, minimize() and service merging |
| Kover, JaCoCo | #218. |
| detekt | kargo lint, with [lint] config for your detekt.yml |
| ktlint | kargo fmt |
| Spotless | kargo fmt for Kotlin. Other languages: a task that calls your formatter |
| Dokka | kargo doc |
Versions (ben-manes) |
kargo outdated and kargo upgrade |
| SonarQube | A task that runs the scanner, with JUnit reports from kargo test --report junit |
| Jib | #223. Until then, kargo package and a Dockerfile |
| Spring Boot | [frameworks] spring-boot; see Spring Boot |
| Protobuf | A [[generate]] step with builtin = "protobuf" |
| SQLDelight | A [[generate]] step with run that calls SQLDelight’s command-line generator (there is no built-in step) |
| BuildConfig (gmazoure, buildconfig) | [env] expose generates a BuildConfig; see Code generation |
| Dependency-Check | kargo audit |
| Application, Distribution | kargo package; distributions are kargo package --dist |
| Maven Publish, Signing, Vanniktech | kargo publish |
| Compose Multiplatform | [frameworks] compose; see Compose |
Keeping this page honest
Section titled “Keeping this page honest”Each Planned row names its issue. When a gap closes or opens, change its row here in the same change. Report a missing row or a wrong status in an issue.