Newer versions of toolkits dropped support for Scala 2.12
Scala Toolkit
Scala Toolkit is an ongoing effort by Scala Center and VirtusLab to compose a set of approachable libraries to solve everyday problems.
You can easily add it to your Scala CLI project with the --toolkit
option:
println(os.pwd)
scala-cli UseOsLib.sc --toolkit default
Similarly, you can achieve the same with the using toolkit
directive:
//> using toolkit default
@main def printPwd: Unit = println(os.pwd)
Scala Toolkit and tests
Adding Scala Toolkit to your project effectively adds 2 dependencies to your classpath:
org.scala-lang:toolkit:<version>
for your main scope (usable everywhere in the project);org.scala-lang:toolkit-test:<version>
for your test scope (usable only in tests).
toolkit-test
includes a batch of libraries only relevant for testing (like i.e. munit
), which you probably don't
want on your main scope
class path (which is why Scala CLI won't put it there).
And so, you can use it like this:
//> using toolkit default
class Something extends munit.FunSuite {
test("foo") {
assert(true)
}
}
scala-cli test Something.test.scala
Also, in case you only want Scala Toolkit to be added to the test scope (and not for the main scope in any capacity),
you can always use the using test.toolkit
directive.
//> using test.toolkit default
class Another extends munit.FunSuite {
test("foo") {
assert(os.pwd.last.nonEmpty)
}
}
scala-cli test Another.test.scala project.scala
More details about test scope directives can be found in
the using
directives guide.
Other toolkits
Scala CLI also supports adding other toolkits to your project in a similar manner. Those have to follow the same
structure of 2 dependencies with the names toolkit
and toolkit-test
.
To do so, you have to explicitly pass the organisation the toolkit was released under (or an alias if defined).
For example, to add the Typelevel Toolkit to your project, you can pass it with
the --toolkit
option:
import cats.effect.*
import fs2.io.file.Files
object Hello extends IOApp.Simple {
def run = Files[IO].currentWorkingDirectory.flatMap { cwd =>
IO.println(cwd.toString)
}
}
scala-cli UseTypelevel.scala --toolkit org.typelevel:default
scala-cli UseTypelevel.scala --toolkit typelevel:default # typelevel has a shorter alias defined
Similarly, you can achieve the same with the using toolkit
directive:
//> using toolkit org.typelevel:default
import cats.effect.*
import fs2.io.file.Files
object Hello extends IOApp.Simple {
def run = Files[IO].currentWorkingDirectory.flatMap { cwd =>
IO.println(cwd.toString)
}
}
Or with the alias:
//> using toolkit typelevel:default
import cats.effect.*
import fs2.io.file.Files
object Hello extends IOApp.Simple {
def run = Files[IO].currentWorkingDirectory.flatMap { cwd =>
IO.println(cwd.toString)
}
}