Creating a custom plugin
One of the great features of Gradle is the support for plugins. A plugin can contain tasks, configurations, properties, methods, concepts, and more to add extra functionality to our projects. For example, if we apply the Java plugin to our project, we can immediately invoke the compile, test, and build tasks. We also have new dependency configurations that we can use and extra properties that we can configure. The Java plugin itself applies the Java base plugin. The Java base plugin doesn't introduce tasks, but it introduces the concept of source sets. This is a good pattern for creating our own plugins, where a base plugin introduces new concepts and another plugin derives from the base plugin and adds explicit build logic-like tasks.
So a plugin is a good way to distribute build logic that we want to share between projects. We can write our own plugin, give it an explicit version, and publish it too; for example, a repository. Other projects can then reuse the functionality...