Awesome
sbt-ammonite-classpath
sbt-ammonite-classpath is an sbt plug-in to export classpath of an sbt project to Ammonite Script, which can be then used in Ammonite or Almond. Also supports running Ammonite REPL directly with desired classpath.
Usage
// project/plugins.sbt
addSbtPlugin("com.thoughtworks.deeplearning" % "sbt-ammonite-classpath" % "latest.release")
// src/main/scala/mypackage/MyObject.scala
package mypackage
object MyObject {
def hello() = println("Hello, World!")
}
Exporting Classpath for Almond or Ammonite
$ sbt Compile/fullClasspath/exportToAmmoniteScript && amm --predef target/scala-2.12/fullClasspath-Compile.sc
...
...
...
[success] Total time: 1 s, completed Apr 17, 2018 10:11:08 AM
Loading...
Compiling /private/tmp/example/target/scala-2.12/fullClasspath-Compile.sc
Welcome to the Ammonite Repl 1.1.0
(Scala 2.12.4 Java 1.8.0_162)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
@ mypackage.MyObject.hello()
Hello, World!
Alternatively the classpath can be dynamically loaded by an import $file
statement, too:
$ amm
Loading...
Welcome to the Ammonite Repl 1.1.0
(Scala 2.12.4 Java 1.8.0_162)
If you like Ammonite, please support our development at www.patreon.com/lihaoyi
@ import $file.target.`scala-2.12`.`fullClasspath-Compile`
Compiling /private/tmp/example/target/scala-2.12/fullClasspath-Compile.sc
import $file.$
@ mypackage.MyObject.hello()
Hello, World!
Launching Ammonite REPL
This plugin also supports directly running Ammonite REPL from sbt. Similar to using above scopes you may launch the Ammonite REPL with desired classpath and compile scope as follows:
sbt "{scope}:{classpath}::launchAmmoniteRepl"
Where scope
can be one of compile
, test
and runtime
, while classpath
can be one of fullClasspath
, dependencyClasspath
, managedClasspath
, unmanagedClasspath
.
Example:
sbt "test:dependencyClasspath::launchAmmoniteRepl"
If you would like to run Ammonite REPL with full classpath, you can simply use launchAmmoniteRepl
task within compile
(or any other) scope without having to specify classpath task scope:
sbt "compile:launchAmmoniteRepl"
# or simply (without scope, compile will be implied)
sbt launchAmmoniteRepl
initialCommands
setting is also supported. If your initialCommands
or launchAmmoniteRepl / initialCommands
setting is not appropriate for a given scope, you can override it in one of this plugin's scopes. For example if you would like to only have import ammonite.ops._
in your Ammonite REPL but not Scala REPL, you can do as follows:
...
console / initialCommands := "println(\"Hello Console\")",
Compile / launchAmmoniteRepl / initialCommands += "\nimport ammonite.ops._"
// or simply launchAmmoniteRepl / initialCommands
...
When you run sbt launchAmmoniteRepl
, both commands will be in effect:
sbt launchAmmoniteRepl
...
[info] running ammonite.Main --predef /private/tmp/example/target/scala-2.13/fullClasspath-Compile.sc --predef-code "println("Hello Console")
[info] import ammonite.ops._"
Loading...
Hello Console
Welcome to the Ammonite Repl 2.2.0-4-4bd225e (Scala 2.13.3 Java 1.8.0_252)
@ ls! pwd
res2: LsSeq =
".bloop" ".gitignore" ".vscode" "build.sbt" 'target
".git" ".metals" 'LICENCE 'project 'test
".github" ".scalafmt.conf" "README.md" 'src
@
By default it will use the "latest.release"
version of Ammonite, but if you would like to change it, you can override ammoniteVersion
setting, e.g.:
ammoniteVersion := "2.1.4"
Test / ammoniteVersion := "2.2.0"
Related work
sbt-ammonite is an sbt 0.13 plug-in to launch Ammonite. It automatically passes the classpath instead of creating a sc
file. However, it does not support Almond.
Requirements
- Sbt 1.x