Blog
Rationalisierung der Scala-Entwicklung mit Nix und Scala-cli

Der Einstieg in die funktionale Programmierung in Scala hat sich mit der Integration von Nix und Scala-cli-toolkit deutlich vereinfacht. In diesem Blogbeitrag finden Sie eine Anleitung und die meisten Befehle, die Ihnen den Einstieg in Scala erleichtern.
Einführung in Nix und Scala-cli
Nix Paket Manager
Nix hat sich zu einem vielseitigen Paketmanager entwickelt (die Entwicklung hat 20 Jahre gedauert), der für seinen innovativen Ansatz zur Verwaltung von Abhängigkeiten und reproduzierbaren Builds bekannt ist. Seine deklarative Sprache und sein unveränderliches Infrastrukturmodell bieten Entwicklern die Kontrolle über ihre Entwicklungsumgebungen. Nix zeichnet sich als ein Werkzeug aus, mit dem Teams Software effizient und zuverlässig erstellen, bereitstellen und verwalten können.
Scala-cli Einführung
Scala-cli, ein unverzichtbares Tool innerhalb des Scala-Ökosystems, rationalisiert den Entwicklungsprozess für Scala-Projekte. Scala-cli wurde entwickelt, um die Produktivität und Wartungsfreundlichkeit zu verbessern und bietet Entwicklern eine einheitliche Plattform für Projektmanagement, Abhängigkeitsauflösung und Build-Automatisierung. Durch die Vereinfachung der Einrichtung und Konfiguration von Scala-Projekten ermöglicht Scala-cli den Teams, sich auf die Bereitstellung von hochwertigem Code und innovativen Lösungen zu konzentrieren, ohne sich mit mühsamen manuellen Aufgaben belasten zu müssen.
Abhängigkeiten: Installieren Sie einfach Nix
Wir empfehlen, der Installationsanleitung aus der Quelle(https://nixos.org/download#nix-install-macos) zu folgen, aber auf Mac/Linux mit einem einzigen Befehl
sh <(curl -L https://nixos.org/nix/install)
Scala CLI introduction
überprüfen Sie die Installation
❯ nix --version
nix (Nix) 2.19.3
Im letzten Schritt werden wir Nix Flakes aktivieren. Der einfachste und weniger dauerhafte Weg, sie zu aktivieren, ist das Hinzufügen des Flags zum Befehl nix./nix
nix --experimental-features 'nix-command flakes'
Typelevel nix entwickeln
Mit nur einem Befehl (Flakes müssen aktiviert sein, folgen Sie den vorgeschlagenen experimentellen Flags, wenn/falls ein Fehler auftritt) nix develop github:typelevel/typelevel-nix#application
Dadurch erhalten wir eine vollständige Scala-Entwicklungsumgebung mit verschiedenen Tools (nicht vollständig): Coursier, JVM, node, Gitter8, scala-fmt, scala-fix, scala-cli.
$ nix develop github:typelevel/typelevel-nix#application
Welcome to typelevel-app-shell
[general commands]
menu - prints this menu
sbt - A build tool for Scala, Java and more
scala-cli - Command-line tool to interact with the Scala language
[versions]
Java - 17.0.1
$ sbt -version
sbt version in this project: 1.9.8
sbt script version: 1.9.8
$ exit
Type level nix develop
Nachdem Sie die Shell verlassen haben, werden Sie feststellen, dass sich das zugrunde liegende System nicht geändert hat und Scala nicht mehr verfügbar ist.
Scala-CLI
Bis zu diesem Punkt haben wir shell mit allen Werkzeugen, die notwendig sind, um in Scala produktiv zu sein. Von diesen Werkzeugen werden wir uns mit
Einfacher Umgang mit Scala-Versionen, Abhängigkeiten und JVM
Scala Versionen
❯ scala-cli run HelloWorld.scala
Compiling project (Scala 3.3.1, JVM (17))
Compiled project (Scala 3.3.1, JVM (17))
Hello, World!
❯ scala-cli --scala 2.13.6 HelloWorld.scala
Compiling project (Scala 2.13.6, JVM (17))
Compiled project (Scala 2.13.6, JVM (17))
Hello, World!Scala Versions
JVM-Versionen
❯ scala-cli --jvm 8 HelloWorld.scala
Downloading JVM zulu:8
Compiling project (Scala 3.3.1, JVM (8))
Compiled project (Scala 3.3.1, JVM (8))JVM Versions
Hinzufügen von Abhängigkeiten zu Ihrer REPL
❯ scala-cli --dep org.scalatest::scalatest:3.2.18
Welcome to Scala 3.3.1 (17.0.5, Java Java HotSpot(TM) 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala> // scalatest availableAdd dependencies to your repl
Es gibt noch viele weitere Funktionen, die es wert sind, erkundet zu werden. Besuchen Sie die Scala-cli-Dokumentation, um einen vollständigen Überblick zu erhalten.scala versions dependencies and jvm with ease
Scripting von 3 Aufträgen auf funktionelle Weise
Wir werden 3 Dateien/Skripte schreiben, und dafür benötigen wir eine grundlegende vscode metals lsp-Einrichtung.Scripting 3 Jobs auf funktionale Weise
$> scala-cil setup-ide .
$> touch HttpScript.scala
$> code .
Einfacher http4s-Client
//> using toolkit typelevel:0.1.21
//> using dependency org.http4s::http4s-dsl:0.23.25
//> using dependency org.http4s::http4s-ember-server:0.23.25
import cats.effect._
import cats.syntax.all._
import org.http4s._, org.http4s.dsl.io._, org.http4s.implicits._
import cats.effect._
import com.comcast.ip4s._
import org.http4s.HttpRoutes
import org.http4s.dsl.io._
import org.http4s.implicits._
import org.http4s.ember.server.EmberServerBuilder
object Http4sScript extends IOApp {
val helloWorldService = HttpRoutes
.of[IO] { case GET -> Root / "hello" / name =>
Ok(s"Hello, $name.")
}
.orNotFound
def run(args: List[String]): IO[ExitCode] =
EmberServerBuilder
.default[IO]
.withHost(ipv4"0.0.0.0")
.withPort(port"8080")
.withHttpApp(helloWorldService)
.build
.use(_ => IO.never)
.as(ExitCode.Success)
}
❯ scala-cli run Http4s.scala
Compiling project (Scala 3.3.1, JVM (17))
Compiled project (Scala 3.3.1, JVM (17))
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
# Separate shell
❯ http get localhost:8080/hello/xebia
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 13
Content-Type: text/plain; charset=UTF-8
Date: Sat, 17 Feb 2024 02:38:06 GMT
Hello, xebia.
Einfache f2s-Streams
Führen Sie außerdem testsBasicf2s Streams aus.
//> using scala 3.3.1
//> using dep "org.scalamock::scalamock:6.0.0-M1"
//> using dep "org.scalatest::scalatest:3.2.18"
import org.scalamock.scalatest.MockFactory
import org.scalatest.funsuite.AnyFunSuite
class Example:
def method(input: String): String = "placeholder"
class MockTest extends AnyFunSuite with MockFactory:
test("Mocking Example.method") {
val example = mock[Example]
(example.method _).expects("input").returning("output")
assert(example.method("input") == "output")
}
❯ scala-cli test MockTest.scala
Compiling project (Scala 3.3.1, JVM (17))
Compiled project (Scala 3.3.1, JVM (17))
MockTest:
- Mocking Example.method
Run completed in 66 milliseconds.
Total number of tests run: 1
Suites: completed 1, aborted 0
Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
All tests passed.
Besseres Shell-Scripting
Scala ist jetzt eine Skriptsprache. Wir empfehlen die Lektüre Scala-cli ist großartig für Shell-Skripte.Better shell scripting
Zusammenfassung
In diesem Blog geht es in erster Linie darum, Einblicke in die Einrichtung von Scala zu geben und den Prozess der Erstellung praktischer Anwendungen zu vereinfachen. Wir haben hier zwar eine Reihe von Tools vorgestellt, aber es ist wichtig zu wissen, dass es zu jedem Tool eine Fülle von Informationen gibt, in die Sie eintauchen können. Wir möchten Ihnen hier eine wertvolle Ressource zum Nachschlagen bieten, Sie inspirieren und zur weiteren Erforschung und Entwicklung innerhalb des Scala-Ökosystems ermutigen.
Verfasst von
Esteban Marin
Scala Developer. Functional programming enthusiast.
Unsere Ideen
Weitere Blogs
Contact



