Skip to content

Instantly share code, notes, and snippets.

@deors
Last active September 26, 2021 21:42
Show Gist options
  • Save deors/7f2acc09dca77dbc7b4508d0d2d9a34a to your computer and use it in GitHub Desktop.
Save deors/7f2acc09dca77dbc7b4508d0d2d9a34a to your computer and use it in GitHub Desktop.
Scala y sbt - primeros pasos (guía rápida en español)

Scala y sbt - primeros pasos (guía rápida en español)

  1. Instalación y primer arranque

descargar sbt launcher desde http://www.scala-sbt.org/

hay versión zip y msi

yo prefiero zip y añado manualmente al path, así puedo tener varias versiones, o probar con seguridad una nueva sin romper proyectos…

ejecutar el comando:

sbt

ahora es cuando se descarga realmente sbt, ya que lo que te bajas es un launcher

todo se queda descargado en %USERPROFILE%\.sbt

curiosidad: sbt usa el modelo de repositorio de Ivy

por defecto sbt asume que el proyecto está en el directorio desde donde lo hemos invocado, así que mejor tener creado primero el proyecto

cerramos con el comando:

exit

creamos el proyecto:

cd <your-workspace-home>
mkdir scalafirst
cd scalafirst

creamos el fichero build.sbt con el siguiente contenido

name := "scalafirst"
scalaVersion := "2.11.8"

ejecutamos de nuevo el comando:

sbt

como hay un fichero de build con una versión de Scala, se la descarga (si no la tenías ya)

creamos el fichero src\main\scala\scalafirst\HelloScala.scala con el siguiente contenido

package scalafirst
object ClassicFirstProgram {
    def main(args: Array[String]): Unit = {
      println("Hello to the world of Scala!")
    }
}

dentro de sbt ejecutamos:

compile
run

también se puede lanzar directamente run y se compilan automáticamente los cambios si los hubiera

si en lugar de ejecutar el comando de forma sencilla se ejecuta con tilde delante, así:

~run

sbt estará monitorizando la carpeta del proyecto y re-compilando y re-ejecutando ante cada cambio

aunque lo anterior es muy útil, aún lo es más si lo que lanzas automáticamente son las pruebas del proyecto:

~test
  1. Añadiendo pruebas

para añadir pruebas, primero debemos elegir el framework de prueba que se ajusta a nuestro estilo y necesidades

uno de los más utilizados es ScalaTest

para empezar a usarlo, añadimos la siguiente dependencia al fichero build.sbt

libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"

creemos una clase sencilla sobre la que realizar pruebas, p.ej. creamos la clase Rational en el fichero src\main\scala\scalafirst\Rational.scala

package scalafirst

class Rational(n: Int, d: Int) {
    private val g = gcd(n.abs, d.abs)
    val num: Int = n
    val den: Int = d
    require(den != 0) // IllegalArgumentException si no se cumple la condición
    override def toString = num + "/" + den
    def this(n: Int) = this(n, 1) // si el denominador no se indica, se asume 1
    private def gcd(a: Int, b: Int): Int = // definición del máximo común divisor
        if (b == 0) a else gcd(b, a % b)    
    def +(other: Rational): Rational =
        new Rational(num * other.den + den * other.num, den * other.den)
    def -(other: Rational): Rational =
        new Rational(num * other.den - den * other.num, den * other.den)
    def *(other: Rational): Rational =
        new Rational(num * other.num, den * other.den)
    def /(other: Rational): Rational =
        new Rational(num * other.den, den * other.num)
    // to-do: al comparar dos racionales, deberían ser iguales si son fracciones equivalentes
}

ahora creamos la clase de pruebas correspondiente, en este caso src\test\scala\scalafirt\RationalSpec.scala

package scalafirst

import org.scalatest._

class RationalSpec extends FlatSpec {
    "A rational with denominator 1" should "be equal to a natural number" in {
        val rat1 = new Rational(5)
        val rat2 = new Rational(5, 1)
        assert(rat1.toString === rat2.toString)
    }

    "A rational with denominator 0" should "not be allowed as it is not a valid rational" in {
        assertThrows[IllegalArgumentException] {
            new Rational(5, 0)
        }
    }
}

y desde sbt ejecutamos el comando:

~test

y veremos cómo se ejecutan las pruebas y de forma automática se re-ejecutan si cambia algún fuente del proyecto.

@nandosola
Copy link

nandosola commented Mar 10, 2017

Otra opción es descargarlo manualmente via sbt-launcher.jar

http://www.scala-sbt.org/0.13/docs/Manual-Installation.html

De esta manera, podemos añadir la versión de sbt para el proyecto en build.properties. De esta manera, la estructura del proyecto SBT queda como:

12:37 $ tree project/
project/
├── build.properties
├── Build.scala
├── plugins.sbt

@deors
Copy link
Author

deors commented Mar 10, 2017

añadido segundo ejemplo (clase Rational) para introducir cómo hacer pruebas con ScalaTest

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment