Formatools Forma Save

Meta build system with Android and Gradle support.

Project README

Logo

GitHub code size in bytes License Contributors GitHub top language GitHub closed pull requests GitHub Repo stars

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.

  • You don't need to be a gradle expert anymore
  • Get rid of project configuration bad practices
  • Type-safe, single method configuration for your targets, no room for error
  • Built-in dependency visibility rules
  • Target types - enforce scalable project structure
  • High-performance builds: Gradle best practices are applied automatically
  • Dependencies framework - helps developers to understand and deal with transitive dependencies hell
  • Extensible - be the expert when you need to!
  • And much more...

⚠️ 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🏠

Presentation Link

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
    )
)

Progress

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

Dependency matrix

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

Open Source Agenda is not affiliated with "Formatools Forma" Project. README Source: formatools/forma
Stars
184
Open Issues
24
Last Commit
5 months ago
Repository
License

Open Source Agenda Badge

Open Source Agenda Rating