Как я могу получить автоматическое разрешение зависимостей в моих сценариях 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
Спасибо за помощь!
Ответы
Ответ 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]"
!#