Meta build system with Android and Gradle support.
Forma - Kotlin first, Meta Build System with Android and Gradle support. Opinionated, scalable, thoughtfully
structured, type-safe and guided way to declare your project structure. Distributed as a Gradle plugin, Forma helps
developers to shift focus from Build Configuration
to Project Structure Declaration
, abstracting away build
configuration complexity.
β οΈ We are using target
term to express application components(e.g. modules or projects, depending in the context)
across documentation and code, there is a couple of reasons for that. Module
term often confused with Dagger modules
which makes communication harder, project
from the other hand used only in Gradle context but not in other build
systems like Buck and Bazel.
β οΈ This is early alpha release - please do try this at homeπ
Configuration made easy:
// root build.gradle.kts
pluginManagement {
repositories {
google()
gradlePluginPortal()
mavenCentral()
}
}
plugins {
id("tools.forma.android") version "0.1.3"
}
// Configure shared aspects of your android Project
buildscript {
androidProjectConfiguration(
project = project,
minSdk = 21,
targetSdk = 33,
compileSdk = 33,
agpVersion = "7.4.2",
extraPlugins = listOf(
"androidx.navigation:navigation-safe-args-gradle-plugin:2.5.3",
"com.google.firebase:firebase-crashlytics-gradle:2.9.4",
)
)
}
Your kotlin android library
// Single method, type-safe creation of your target
// Plugins applied automatically
// Project configuration shared between targets
androidLibrary(
// Mandatory, visible from build configuration
packageName = "tools.forma.sample.example",
// External dependencies declaration, one universal syntax
dependencies = deps(
google.material,
androidx.appcompat,
) + deps(
// Internal project dependencies, declared separately from externals
project(":demo-library")
),
// Test dependencies declaration
testDependencies = deps(
test.junit
),
// Android test dependencies declaration
androidTestDependencies = deps(
test.espresso
)
)
Supported target types | implemented | purpose | validation |
---|---|---|---|
androidBinary | β | Generate single APK | β |
androidApp | β | Application class | partial |
androidLibrary | β | Android library | partial |
androidWidget | β | Custom View | partial |
androidRes | β | Resources Only | β |
androidTestUtils | β | Shared code for Android tests | β |
androidUtils | β | Library extensions | partial |
testUtils | β | Shared code for unit tests | β |
utils | β | JVM Library extensions | partial |
library | β | JVM Library | partial |
api | β | Feature external API's | partial |
impl | β | Feature implementation | partial |
Each columh represents the list of allowed/disallowed dependencies
androidApp | androidBinary | androidLibrary | androidWidget | androidRes | androidTestUtils | api | impl | androidUtils | utils | testUtils | |
---|---|---|---|---|---|---|---|---|---|---|---|
androidApp | β | β | β | β | β | β | β | β | β | β | β |
androidBinary | β | β | β | β | β | β | β | β | β | β | β |
androidLibrary | β | β | β | β | β | β | β | β | β | β | β |
androidWidget | β | β | β | β | β | β | β | β | β | β | β |
androidRes | β | β | β | β | β | β | β | β | β | β | β |
androidTestUtils | β | β | β | β | β | β | β | β | β | β | β |
api | β | β | β | β | β | β | β | β | β | β | β |
impl | β | β | β | β | β | β | β | β | β | β | β |
androidUtils | β | β | β | β | β | β | β | β | β | β | β |
utils | β | β | β | β | β | β | β | β | β | β | β |
testUtils | β | β | β | β | β | β | β | β | β | β | β |
Icons made by Freepik from www.flaticon.com