2011-09-29 10 views
13

Estoy aprendiendo scala que sale del mundo groovy/java. Mi primer script requiere una biblioteca de terceros TagSoup para el análisis XML/HTML, y me resisto a tener que agregarlo a la vieja escuela: es decir, descargar TagSoup de su sitio web desarrollador y luego agregarlo a la ruta de la clase.¿Cómo puedo obtener una resolución de dependencia automática en mis scripts de scala?

¿Hay alguna forma de resolver bibliotecas de terceros en mis scripts de scala? Estoy pensando en Ivy, estoy pensando en Grape.

Ideas?


La respuesta que funcionó mejor para mí era instalar N8:

curl https://raw.github.com/n8han/conscript/master/setup.sh | sh 
cs harrah/xsbt --branch v0.11.0 

Entonces podría importar tagsoup example.scala con bastante facilidad

/*** 
     libraryDependencies ++= Seq(
      "org.ccil.cowan.tagsoup" % "tagsoup" % "1.2.1" 
    ) 
    */ 

    def getLocation(address:String) = { 
     ... 
    } 

Y ejecutar utilizando scalas:

scalas example.scala 

Gracias por th e ayuda!

Respuesta

11

Si bien la respuesta es SBT, podría haber sido más útil cuando se consideran scripts. Ver, SBT tiene algo especial para los scripts, como se describe en here.Una vez que obtenga scalas instalado, ya sea mediante la instalación de conscript y ejecutando cs harrah/xsbt --branch v0.11.0, o simplemente escribiendo usted mismo más o menos así:

#!/bin/sh 
java -Dsbt.main.class=sbt.ScriptMain \ 
    -Dsbt.boot.directory=/home/user/.sbt/boot \ 
    -jar sbt-launch.jar "[email protected]" 

Entonces se puede escribir el guión de esta manera:

#!/usr/bin/env scalas 
!# 

/*** 
scalaVersion := "2.9.1" 

libraryDependencies ++= Seq(
    "net.databinder" %% "dispatch-twitter" % "0.8.3", 
    "net.databinder" %% "dispatch-http" % "0.8.3" 
) 
*/ 

import dispatch.{ json, Http, Request } 
import dispatch.twitter.Search 
import json.{ Js, JsObject } 

def process(param: JsObject) = { 
    val Search.text(txt)  = param 
    val Search.from_user(usr) = param 
    val Search.created_at(time) = param 

    "(" + time + ")" + usr + ": " + txt 
} 

Http.x((Search("#scala") lang "en") ~> (_ map process foreach println)) 

También le puede interesar paulp's xsbtscript, que crea un shell xsbtscript que tiene lo mismo que scalas (supongo que este último se basó en el primero), con la ventaja de que, sin conscripto o sbt instalado, puede que esté listo con esto:

curl https://raw.github.com/paulp/xsbtscript/master/setup.sh | sh 

Tenga en cuenta que se instala SBT y recluta.

Y también está paulp's sbt-extras, que es una línea de comando alternativa "sbt", con más opciones. Tenga en cuenta que todavía es sbt, solo el script de shell que lo inicia es más inteligente.

+0

Voy a intentar esto - gracias , suena exactamente como lo que estoy buscando. – dsummersl

+0

¡Esto funcionó por completo para mí! – dsummersl

+1

// nota: hice una respuesta actualizada basada en la tuya. (En realidad fue escrito desde cero, así que lo hice por separado). – VasyaNovikov

7

Puesto como respuesta porque no cabe en la restricción de longitud de comentario.

Además de la respuesta de @Chris, me gustaría recomendarle algunos recursos comunes para sbt (que personalmente considero que es absolutamente excelente). Aunque sbt denote Simple Build Tool, a veces no es tan fácil para los principiantes configurar el proyecto con sbt (todo esto con diseños, configuraciones, etc.).

Use giter (g8) para crear un nuevo proyecto con una plantilla predefinida (que g8 obtiene de github.com). Hay plantillas para Android app, unfiltered y more. A veces se incluyen algunas de las dependencias por defecto. Para crear el diseño solo tipo:

g8 gseitz/android-sbt-project 

(Un ejemplo de aplicación de Android)

otra alternativa es utilizar np pluggin de SBT, que proporciona una forma de tipo medio interactivo para crear un nuevo proyecto y el diseño básico.

+0

Gracias por la información adicional - Creo que sbt es la respuesta básica que estoy buscando, pero su información adicional será útil, ya que hago más scala estoy seguro :) – dsummersl

0

Lo que dijo Daniel. Aunque vale la pena mencionar que el sbt docs etiqueta cuidadosamente esta funcionalidad como "experimental".

De hecho, si se intenta ejecutar el script incrustado con scalaVersion:! = "2.10.3", obtendrá

not found: value !#

Por suerte, el # script cabecera más estrecha es innecesaria aquí, lo que puede dejar fuera.

En scalaVersion: = "2.10.3", el script deberá tener la extensión de archivo ".scala"; usar la extensión de archivo de script de shell bash, ".sh", no funcionará.

Además, no está claro para mí que la última versión de Dispatch (0.11.0) admita dispatch-twitter, que se utiliza en el ejemplo.

Para obtener más información sobre los cierres de encabezado en este contexto, consulte blog post de Alvin Alexander en scripting Scala, o la sección 14.10 de su Scala Cookbook.

0

Tengo un archivo build.gradle con la siguiente tarea:

task classpath(dependsOn: jar) << { 
    println "CLASSPATH=${tasks.jar.archivePath}:${configurations.runtime.asPath}" 
} 

Luego, en mi guión Scala:

#! 
script_dir=$(cd $(dirname "$0") >/dev/null; pwd -P) 

classpath=$(cd ${script_dir} && ./gradlew classpath | grep '^CLASSPATH=' | sed -e 's|^CLASSPATH=||') 

PATH=${SCALA_HOME}/bin:${PATH} 

JAVA_OPTS="-Xmx4g -XX:MaxPermSize=1g" exec scala -classpath ${classpath} "$0" "$0" "[email protected]" 
!# 
1

una versión corregida y simplificada de la corriente principal respuesta: usar scalas. Una forma de cómo configurarlo está a continuación.

Si prefiere simplemente leer la fuente, aquí está: https://gist.github.com/vn971/b518b5f41c2c10dff1f4

Explicación. Tienes que componer tu script de 3 partes. Uno sería sbt, otro sería un contenedor muy simple alrededor de SBT llamado scalas, el último es su script personalizado. Tenga en cuenta que los primeros dos scripts se pueden instalar globalmente (/ usr/bin /, ~/bin /) o localmente (en el mismo directorio).

  • la primera parte es sbt. Si ya lo tienes instalado, entonces bien.Si no, puedes instalarlo o usar un guión muy bueno de paulp: https://github.com/paulp/sbt-extras/blob/master/sbt BTW, esa es una forma encantadora de usar sbt en Unix. Aunque no está disponible en Windows. De todos modos ...

  • la segunda parte es scalas. Es solo un punto de entrada a SBT.

#!/bin/sh 
sbt -Dsbt.main.class=sbt.ScriptMain -sbt-create \ 
    -Dsbt.boot.directory=$HOME/.sbt/boot \ 
    "[email protected]" 
  • la última parte es el script personalizado. Ejemplo:
#!/usr/bin/env scalas 
/*** 
scalaVersion := "2.11.0" 

libraryDependencies ++= Seq(
    "org.joda"   % "joda-convert"  % "1.5", 
    "joda-time"   % "joda-time"   % "2.3" 
) 
*/ 

import org.joda.time._ 

println(DateTime.now()) 
//println(DateTime.now().minusHours(12).dayOfMonth()) 
  • nota de que en caso de una instalación no global que tendría que utilizar rutas relativas. Use ./sbt dentro de scalas y use ./scalas dentro del script principal.
Cuestiones relacionadas