:samples-dir: /home/tcagent1/agent/work/2822076975d89a59/promote-projects/gradle/build/git-checkout/subprojects/docs/build/working/samples/install/sharing-convention-plugins-with-build-logic
:gradle-version: 7.6.6

= Sharing convention plugins with build logic build Sample

[.download]
- link:zips/sample_sharing_convention_plugins_with_build_logic-groovy-dsl.zip[icon:download[] Groovy DSL]
- link:zips/sample_sharing_convention_plugins_with_build_logic-kotlin-dsl.zip[icon:download[] Kotlin DSL]

NOTE: You can open this sample inside an IDE using the https://www.jetbrains.com/help/idea/gradle.html#gradle_import_project_start[IntelliJ native importer] or https://projects.eclipse.org/projects/tools.buildship[Eclipse Buildship].

This sample shows how _convention plugins_ can be shared and applied to both the production code and the build logic code in _buildSrc_.

Let's use the following project structure:
====
[.multi-language-sample]
=====
.Project structure
[source, groovy]
----
├── application
│   ├── src
│   │   └── main
│   └── build.gradle
├── build-conventions
│   ├── src
│   │   ...
│   ├── build.gradle
│   └── settings.gradle
├── buildSrc
│   ├── src
│   │   ...
│   └── build.gradle
├── list
│   ├── src
│   │   ...
│   └── build.gradle
├── utilities
│   ├── src
│   │   ...
│   └── build.gradle
└── settings.gradle
----
=====
[.multi-language-sample]
=====
.Project structure
[source, kotlin]
----
├── application
│   ├── src
│   │   └── main
│   └── build.gradle.kts
├── build-conventions
│   ├── src
│   │   ...
│   ├── build.gradle.kts
│   └── settings.gradle.kts
├── buildSrc
│   ├── src
│   │   ...
│   └── build.gradle.kts
├── list
│   ├── src
│   │   ...
│   └── build.gradle.kts
├── utilities
│   ├── src
│   │   ...
│   └── build.gradle.kts
└── settings.gradle.kts
----
=====
====

The build is configured as follows:
====
include::sample[dir="groovy",files="settings.gradle[]"]
include::sample[dir="kotlin",files="settings.gradle.kts[]"]
====

The shared _convention plugin_ `myproject.java-conventions` is implemented in an _included build_ called `build-conventions`.
The build is then included in the root project's _settings_ file as seen in the above snippet.
For more details about included builds, see link:{userManualPath}/composite_builds.html[Composing Builds] chapter.

The `myproject.java-conventions` plugin is then applied to the `buildSrc` build:
====
include::sample[dir="groovy",files="buildSrc/build.gradle[tags=plugins]"]
include::sample[dir="kotlin",files="buildSrc/build.gradle.kts[tags=plugins]"]
====

It is also applied in the subprojects of the root project:
====
include::sample[dir="groovy",files="application/build.gradle[tags=plugins];utilities/build.gradle[tags=plugins];list/build.gradle[tags=plugins]"]
include::sample[dir="kotlin",files="application/build.gradle.kts[tags=plugins];utilities/build.gradle.kts[tags=plugins];list/build.gradle.kts[tags=plugins]"]
====

For more details on authoring custom Gradle plugins, consult the link:{userManualPath}/custom_plugins.html[user manual].
