Skip to content

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.
  • One package per kargo.toml. There is no settings.gradle.kts plus 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.toml is data. There is no build.gradle.kts to compute things in, no afterEvaluate, no allprojects {}. 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 with kargo <task> or attach to a hook, a hook plugin is a script or a program, and a subcommand is a program called kargo-<name>. There is no task graph API and no plugin classpath. See Tasks, hooks and plugins.
  • Fixed lifecycle and layout. build, check, run, test and package always exist, and sources live in src/, tests/ and resources/ (see Project layout).
  • Android still uses Gradle underneath, but Kargo writes the Gradle project from your kargo.toml.
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
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
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
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
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
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)
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

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.