# Convention Plugins The `build-logic` folder defines project-specific convention plugins, used to keep a single source of truth for common module configurations. This approach is heavily based on [https://developer.squareup.com/blog/herding-elephants/](https://developer.squareup.com/blog/herding-elephants/) and [https://github.com/jjohannes/idiomatic-gradle](https://github.com/jjohannes/idiomatic-gradle). By setting up convention plugins in `build-logic`, we can avoid duplicated build script setup, messy `subproject` configurations, without the pitfalls of the `buildSrc` directory. `build-logic` is an included build, as configured in the root [`settings.gradle.kts`](../settings.gradle.kts). Inside `build-logic` is a `convention` module, which defines a set of plugins that all normal modules can use to configure themselves. `build-logic` also includes a set of `Kotlin` files used to share logic between plugins themselves, which is most useful for configuring Android components (libraries vs applications) with shared code. These plugins are *additive* and *composable*, and try to only accomplish a single responsibility. Modules can then pick and choose the configurations they need. If there is one-off logic for a module without shared code, it's preferable to define that directly in the module's `build.gradle`, as opposed to creating a convention plugin with module-specific setup. Current list of convention plugins: - [`nowinandroid.android.application`](convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt), [`nowinandroid.android.library`](convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt), [`nowinandroid.android.test`](convention/src/main/kotlin/AndroidTestConventionPlugin.kt): Configures common Android and Kotlin options. - [`nowinandroid.android.application.compose`](convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt), [`nowinandroid.android.library.compose`](convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt): Configures Jetpack Compose options