Skip to content
SBT project generator for flexible monorepo flow
Scala Shell
Branch: develop
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
project Update sbt-release to 1.0.12 (#13) Oct 16, 2019
sbt fixed timestamp format in manifest (#15) Oct 22, 2019
sbtgen/src Update sbt, scripted-plugin to 1.3.3 (#12) Oct 14, 2019
sbtmeta/src/main/scala/izumi/sbtgen/sbtmeta
test Update sbt, scripted-plugin to 1.3.3 (#12) Oct 14, 2019
.azure-dockerstep.yml azure Sep 9, 2019
.azure-pipelines.yml wip Sep 9, 2019
.build.sh
.gitignore imports Aug 30, 2019
.jvmopts izumi plugins Sep 9, 2019
README.md add sbt release instructions Oct 22, 2019
build.sbt update sbt-duplicates-finder Oct 22, 2019
keys.sh azure Sep 9, 2019
secrets.tar.enc wip Sep 9, 2019
version.sbt Setting version to 0.0.40-SNAPSHOT Oct 22, 2019

README.md

sbtgen

SBT build generator for role-based projects, based on Ammonite and Coursier.

Details: Monorepo or Multirepo? Role-Based Repositories.

Quick Start

Create a file sbtgen.sc and paste the following code:

#!/bin/sh
coursier launch com.lihaoyi:ammonite_2.13.0:1.6.9 --fork -M ammonite.Main -- sbtgen.sc $*
exit
!#
import $ivy.`io.7mind.izumi.sbt::sbtgen:0.0.38`, izumi.sbtgen._, izumi.sbtgen.model._

val globalSettings = GlobalSettings(
  groupId = "my.org",
)

@main
def entrypoint(args: String*): Unit = {
  Entrypoint.main(MyProject.root, globalSettings, Seq("-o", ".") ++ args)
}

object Platforms {
  val jvm = PlatformEnv(
    platform = Platform.Jvm,
    language = Seq(ScalaVersion("2.13.1")),
    settings = Seq("scalacSettings" += "-Xlint:_"),
  )
}

object MyProject {
  val root = Project(
    name = ArtifactId("my-project"),
    aggregates = Seq(
      Aggregate(
        name = ArtifactId("my-lib"),
        artifacts = Seq(
          Artifact(
            name = ArtifactId("my-module-a"),
            libs = Seq.empty,
            depends = Seq.empty,
            platforms = Seq(Platforms.jvm),
            groups = Set(Group("groupA")),
          ),
          Artifact(
            name = ArtifactId("my-module-b"),
            libs = Seq.empty,
            depends = Seq.empty,
            platforms = Seq(Platforms.jvm),
            groups = Set(Group("groupB")),
          ),
        ),
      ),
    ),
  )
}

Install Coursier and launch the script:

chmod +x sbtgen.sc
./sbtgen.sc

Alternatively, you may launch it with Ammonite if it's installed:

amm sbtgen.sc

This will generate build.sbt for my-project in current directory.

Use ./sbtgen.sc -u groupA or ./sbtgen.sc -u groupB to build only my-module-a or my-module-b

Use ./sbtgen.sc --help for help:

$ ./sbtgen.sc --help
Error: Unknown option --help
sbtgen
Usage: sbtgen [options]

  --nojvm               disable jvm projects
  --js                  enable js projects
  --native              enable native projects
  --nta                 don't publish test artifacts
  -d, --debug           enable debug output
  -c, --compactify      deduplicate repetative settings
  -t, --isolate-tests   don't inherit test scopes
  -o, --output <value>  output directory
  -u, --use <value>     use only groups specified
Cannot parse commandline

IDE Support

Intellij has built-in support for Ammonite scripts, if it doesn't work go to Preferences -> Languages and Frameworks -> Scala -> Worksheet and change Treat .sc files as: to Always Ammonite

To enable syntax highlighting for the library, ensure that sbtgen.sc is opened as an Ammonite script – there should be a Run script button in the upper-left corner. Press it, after script finishes Intellij should prompt to include $ivy dependencies in the script into the project – this will enable full IntelliSense for the script.

Example projects

Complete projects that use this tool:

Contributors: how to publish

To release new version via CI:

sbt +clean +test release

To publish manually:

sbt +clean +sonatypeBundleClean +publishSigned +sonatypeBundleRelease
You can’t perform that action at this time.