Подтвердить что ты не робот

Как я могу получить автоматическое разрешение зависимостей в моих сценариях scala?

Я просто изучаю scala, выходящий из мира groovy/java. Мой первый script требует стороннюю библиотеку TagSoup для синтаксического анализа XML/HTML, и я не хочу добавлять ее в старый школьный путь: загрузка TagSoup со своего веб-сайта разработчика, а затем добавление его в путь класса.

Есть ли способ разрешить сторонние библиотеки в сценариях scala? Я думаю, что Айви, я думаю о Винограде.

Идеи?


Ответ, который лучше всего работал у меня, заключался в установке n8:

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

Тогда я мог бы довольно легко импортировать tagoup example.scala

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

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

И запустить с помощью scalas:

  scalas example.scala

Спасибо за помощь!

4b9b3361

Ответ 1

В то время как ответ - SBT, это могло бы быть более полезным, когда сценарии рассматриваются. Смотрите, SBT имеет особую вещь для скриптов, как описано здесь. Как только вы установили scalas, либо установив conscript, а затем запустив cs harrah/xsbt --branch v0.11.0 или просто, написав его самим более или менее как это:

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

Затем вы можете написать свой script следующим образом:

#!/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))

Вас также может заинтересовать paulp xsbtscript, который создает оболочку xsbtscript, которая имеет то же самое, что и scalas ( Я полагаю, что последнее было основано на первом), с тем преимуществом, что без обоих призывников или sbt, вы можете подготовить его к этому:

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

Обратите внимание, что он устанавливает sbt и призыв.

И там также paulp sbt-extras, который является альтернативной командной строкой "sbt" с большим количеством опций. Обратите внимание, что это все еще sbt, только запущенная оболочка script более интеллектуальна.

Ответ 2

SBT (Simple Build Tool), по-видимому, является инструментом построения в мире Scala. Он поддерживает ряд различных механизмов разрешения зависимостей: https://github.com/harrah/xsbt/wiki/Library-Management

Ответ 3

Размещено как ответ, потому что он не подходит для ограничения длины комментария.

В дополнение к ответу @Chris, я хотел бы порекомендовать вам некоторые общие для sbt (которые я лично считаю абсолютно превосходными). Хотя sbt обозначает Simple Build Tool, иногда первоклассникам не так просто настроить проект с помощью sbt (все это с макетами, конфигами и т.д.).

Используйте giter (g8) для создания нового проекта с предопределенным шаблоном (который g8 выбирает из github.com). Существуют шаблоны для Android-приложения, unfiltered и больше. Иногда они включают некоторые зависимости по умолчанию. Чтобы создать макет, просто введите:

g8 gseitz/android-sbt-project

(пример приложения для Android)

В качестве альтернативы используйте np pluggin для sbt, который предоставляет интерактивный сквозной способ создания нового проекта и базовой компоновки.

Ответ 4

Скорректированная и упрощенная версия текущего основного ответа: используйте scalas. Ниже описано, как настроить его.

Если вы предпочитаете просто читать источник, вот он: https://gist.github.com/vn971/b518b5f41c2c10dff1f4

Объяснение. Вы должны составить свой script из 3 частей. Один из них будет sbt, другой - очень простая оболочка вокруг SBT с именем scalas, последняя - ваш пользовательский script. Обратите внимание, что первые два скрипта могут быть установлены либо глобально (/usr/bin/, ~/bin/), либо локально (в том же каталоге).

  • первая часть sbt. Если вы уже установили его, тогда это хорошо. Если нет, вы можете установить его или использовать очень классный script из paulp: https://github.com/paulp/sbt-extras/blob/master/sbt Кстати, эта вещь очаровательна использовать sbt для Unix. Хотя они недоступны в окнах. В любом случае...

  • вторая часть scalas. Это просто точка входа в SBT.

#!/bin/sh
sbt -Dsbt.main.class=sbt.ScriptMain -sbt-create \
    -Dsbt.boot.directory=$HOME/.sbt/boot \
    "[email protected]"
  • Последняя часть - это ваш пользовательский script. Пример:
#!/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())
  • обратите внимание, что в случае неглобальной установки вам придется использовать относительные пути. Используйте ./sbt внутри scalas и используйте ./scalas внутри основного script.

Ответ 5

Что сказал Даниил. Хотя стоит упомянуть, что sbt docs тщательно маркировать эту функциональность "экспериментальной".

Действительно, если вы попытаетесь запустить встроенный script с помощью scalaVersion: = "2.10.3", вы получите

not found: value !#

К счастью, здесь нет необходимости в заголовке! # script, поэтому вы можете его оставить.

В scalaVersion: = "2.10.3", script необходимо будет иметь расширение файла ".scala"; используя расширение bash shell script, ".sh", не будет работать.

Кроме того, мне непонятно, что последняя версия Dispatch (0.11.0) поддерживает dispatch-twitter, которая используется в примере.

Подробнее о заголовочных устройствах в этом контексте см. Alvin Alexander сообщение в блоге на сценарии Scala или раздел 14.10 его Scala Cookbook.

Ответ 6

У меня есть файл build.gradle со следующей задачей:

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

Затем в моем Scala script:

#!
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]"
!#