ZIO CLI SBT Plugin
Overview​
ZIO CLI offers an SBT plugin to provide some tasks to make generation and deployment of applications simple.
Current State​
The current functionality of the plugin offers:
Native Images​
This SBT plugin depends on and utilizes the sbt-native-image plugin. Tasks and settings related to building a native image map 1:1 to the upstream plugin.
Outstanding Action Items​
- Investigate if any cross versions are needed for different versions of SBT
- Add remaining corresponding upstream configuration options to pass into the
sbt-native-image
plugin. - Implement
zioCliGenerateBashCompletion
, when ready. - Implement
zioCliGenerateZshCompletion
, when ready. - Implement
zioCliInstallCli
, when ready.
Plugin Settings​
zioCliMainClass: Option[String]​
The mainClass of the CLI App in the Compile
scope. Defaults to None
, and will need to be set.
zioCliNativeImageOptions: Seq[String]​
A collection of arguments to pass the native-image builder to customize native image generation. Defaults to
List(
"--allow-incomplete-classpath",
"--report-unsupported-elements-at-runtime",
"--initialize-at-build-time",
"--no-fallback"
)
zioCliNativeImageReady: () => Unit​
A side-effecting callback that is called the native image is ready. Defaults to
() => {
println("ZIO CLI App Native Image Ready!")
}
Plugin Tasks​
zioCliBuildNative: Unit​
Sets mainClass in Compile, and attempts to run nativeImage
with any applied nativeImageOptions
.
Fires zioCliNativeImageReady
on success.
zioCliGenerateBashCompletion: Unit​
Not currently implemented; prints "TODO: Not Implemented!"
zioCliGenerateZshCompletion: Unit​
Not currently implemented; prints "TODO: Not Implemented!"
zioCliInstallCli: Unit​
Not currently implemented; prints "TODO: Not Implemented!"
End User Project Setup​
There are several steps that are needed to use this in an end user project:
Locally Publishing the Plugin​
To compile and locally publish a copy of the SBT plugin, simply call publishLocal
on the sbtZioCli
project. Example:
sbt> project sbtZioCli
sbt> publishLocal
This will locally publish an artifact: "zio.cli.sbt" % "sbt-zio-cli" % "0.0.0-SNAPSHOT"
End User Project​
In your project, configure SBT to use the plugin by adding to project/plugins.sbt
:
addSbtPlugin("zio.cli.sbt" % "sbt-zio-cli" % "0.0.0-SNAPSHOT")
Then, enable the plugin for your project in your build.sbt
file. Example:
lazy val root = project
.in(file("."))
.enablePlugins(ZIOCLIPlugin)
.settings(
CLIPlugin.zioCliMainClass := Some("zio.cli.YourApp")
)
At this point, you should be able to build a native image of your application with the task:
sbt> zioCliBuildNative