alejandrohdezma / sbt-modules

SBT plugin that simplifies modules creation

GitHub

SBT plugin that simplifies modules creation

- skip in publish := true
- 
lazy val docs = project
-  .settings(skip in publish := true)
-  .dependsOn(allProjects: _*)
+  .dependsOn(allModules: _*)
  .in(file("docs"))

+ lazy val `my-library-core` = module
- lazy val core = project
-   .in(file("modules/core"))
-   .settings(name := "my-library-core")

+ lazy val `my-library-plugin` = module 
- lazy val plugin = project
-   .in(file("modules/plugin"))
-   .settings(name := "my-library-plugin")
-   .dependsOn(core)
+   .dependsOn(`my-library-core`)
-
- lazy val allProjects: Seq[ClasspathDep[ProjectReference]] = Seq(
-   core,
-   plugin
- )

Installation

Add the following line to your plugins.sbt file:

addSbtPlugin("com.alejandrohdezma" % "sbt-modules" % "0.1.0")

Usage

Use module instead of project to create your SBT modules. Unlike project, module expects your modules to live in modules folder and uses the name of the variable for the project's ID and base folder (just like project does).

For example, the following SBT configuration:

lazy val `my-library-core` = module

lazy val `my-library-plugin` = module.dependsOn(`my-library-core`) 

Would expect the following directory structure:

.
+-- modules
|   +-- my-library-core
|       +-- src
|   +-- my-library-plugin
|       +-- src
+-- build.sbt
+-- project

Retrieveing all modules created with module

sbt-modules creates a special variable called allModules that aggregates all the modules created with module, so you can pass it along as a dependency to other projects in your build, like:

lazy val documentation = project.dependsOn(allModules: _*)

lazy val `my-library-core` = module

lazy val `my-library-plugin` = module.dependsOn(`my-library-core`)

Auto-skip in publish

Forget about setting skip in publish := true again. Adding this plugin to your build will disable publishing for all the projects in the build (including the auto-generated root plugin), except for those created with module.

However, if you also want to exclude any of those created with module you can always add .settings(skip in publish := true).

Example:

// Will not be published
lazy val documentation = project.dependsOn(allmodules: _*)

// Will be published
lazy val `my-library-plugin` = module.dependsOn(`my-library-core`)

// Will be published
lazy val `my-library-core` = module

// Will not be published
lazy val `my-library-util` = module.settings(skip in publish := true)