Я выхожу из туалета на этом! Я не понимаю SBT. Вот, я сказал, теперь помогите мне, пожалуйста.
Все дороги ведут в Рим, и это то же самое для SBT: Для того, чтобы начать работу с SBT
там SBT
, SBT Launcher
, SBT-extras
и т.д., а затем Существуют различные способы , чтобы включить и принять решение о хранилищах. Есть ли лучший способ?
Я спрашиваю, потому что иногда я немного теряюсь. Документация по SBT очень тщательная и полная, но я не знаю, когда использовать build.sbt
или project/build.properties
или project/Build.scala
или project/plugins.sbt
.
Тогда это становится забавой, есть Scala-IDE
и SBT
- Как правильно использовать их вместе? Что идет первым, курица или яйцо?
Вероятно, самое важное - как найти нужные репозитории и версии для включения в свой проект? Я просто вытащу мачет и начну продвигаться вперед? Я довольно часто нахожу проекты, которые включают все, включая кухонную раковину, и тогда понимаю - я не единственный, кто немного теряется.
В качестве простого примера, прямо сейчас я начинаю совершенно новый проект. Я хочу использовать новейшие функции SLICK
и , Scala
и это, вероятно , потребуется последняя версия SBT. С чего начать и почему? В каком файле я должен его определить и как он должен выглядеть? Я знаю, что могу заставить это работать, но мне бы очень хотелось получить экспертное мнение о том, куда все должно идти (почему это должно идти, будет бонус).
Я использую SBT
для небольших проектов уже более года. Я использовал SBT
а затем SBT Extras
(так как это заставляло некоторые головные боли волшебным образом исчезать), но я не уверен, почему я должен использовать тот или другой. Я просто немного расстраиваюсь из-за того, что не понимаю, как вещи сочетаются друг с другом ( SBT
и репозиториями), и думаю, что это избавит следующего парня, который пойдет этим путем, от множества трудностей, если это можно будет объяснить в человеческих терминах.
Build.scala
настраивали путь к классам, и именно поэтому вам действительно нужен sbteclipse для генерации Eclipse .classpath. Надеюсь это поможет.Ответы:
Для зависимостей на основе Scala я бы согласился с рекомендациями авторов. Например: http://code.google.com/p/scalaz/#SBT указывает на использование:
Или на https://github.com/typesafehub/sbteclipse/ есть инструкции, где добавить:
Для зависимостей на основе Java я использую http://mvnrepository.com/, чтобы посмотреть, что там есть, затем щелкаю вкладку SBT. Например, http://mvnrepository.com/artifact/net.sf.opencsv/opencsv/2.3 указывает на использование:
Затем вытащите мачете и начните продвигаться вперед. Если вам повезет, вы не закончите использовать jar-файлы, которые зависят от некоторых из тех же jar-файлов, но с несовместимыми версиями. Учитывая экосистему Java, вы часто заканчиваете тем, что включаете все и кухонную раковину, и требуются некоторые усилия, чтобы устранить зависимости или убедиться, что вы не пропустите необходимые зависимости.
Я думаю, что разумным является постепенное формирование иммунитета к СБТ .
Убедитесь, что вы понимаете:
{<build-uri>}<project-id>/config:key(for task-key)
SettingKey
,TaskKey
,InputKey
) - прочитайте раздел под названием «Ключи задач» в http://www.scala-sbt.org/release/docs/Getting-Started/Basic-DefВсегда держите эти 4 страницы открытыми, чтобы вы могли прыгать и искать различные определения и примеры:
Максимально используйте кнопки
show
иinspect
и заполнение вкладок, чтобы ознакомиться с фактическими значениями параметров, их зависимостями, определениями и соответствующими параметрами. Я не верю, что отношения, которые вы обнаружите при использованииinspect
, где-либо задокументированы. Если есть лучший способ, я хочу знать об этом.источник
Я использую sbt:
project
папку сMyProject.scala
файлом для настройки sbt. Я предпочитаю этоbuild.sbt
подходу - это scala и более гибкийproject/plugins.sbt
файл и добавьте соответствующий плагин для своей IDE. Либо sbt-eclipse, sbt-idea, либо ensime-sbt-cmd, чтобы вы могли создавать файлы проекта для eclipse, intellij или ensime.Я не беспокоюсь о проверке файлов проекта IDE, поскольку они генерируются sbt, но могут быть причины, по которым вы захотите это сделать.
Вы можете увидеть пример настроить , как это здесь .
источник
Используйте Typesafe Activator, причудливый способ вызова sbt, который поставляется с шаблонами проектов и семенами: https://typesafe.com/activator
источник
Монтаж
brew install sbt
или аналогичные установки sbt, которые технически состоят изКогда вы выполняете
sbt
с терминала, он фактически запускает bash-скрипт sbt launcher. Лично мне никогда не приходилось беспокоиться об этой троице, я просто использовал sbt, как будто это что-то одно.Конфигурация
Чтобы настроить sbt для конкретного проекта, сохраните
.sbtopts
файл в корне проекта. Чтобы настроить sbt в масштабе всей системы, измените/usr/local/etc/sbtopts
. Выполнениеsbt -help
должно сказать вам точное местоположение. Например, чтобы дать SBT больше памяти , как один-офф выполнитьsbt -mem 4096
, или сохранить-mem 4096
в.sbtopts
илиsbtopts
для увеличения памяти вступили в силу на постоянной основе .Структура проекта
sbt new scala/scala-seed.g8
создает минимальную структуру проекта Hello World sbtЧастые команды
Множество снарядов
Определение сборки - это правильный проект Scala
Это одна из ключевых идиоматических концепций SBT. Постараюсь объяснить вопросом. Допустим, вы хотите определить задачу sbt, которая будет выполнять HTTP-запрос с помощью scalaj-http. Интуитивно мы могли бы попробовать следующее внутри
build.sbt
Однако это будет ошибка, говорящая об отсутствии
import scalaj.http._
. Как это возможно , когда мы, прямо выше, добавляютscalaj-http
кlibraryDependencies
? Кроме того, почему это работает, когда вместо этого мы добавляем зависимость вproject/build.sbt
?Ответ заключается в том, что
fooTask
это часть отдельного проекта Scala от вашего основного проекта. Этот другой проект Scala можно найти вproject/
каталоге, у которого есть собственныйtarget/
каталог, в котором находятся его скомпилированные классы. Фактически, нижеproject/target/config-classes
должен быть класс, который декомпилируется во что-то вродеМы видим, что
fooTask
это просто член обычного объекта Scala с именем$9c2192aea3f1db3c251d
. Ясно, что этоscalaj-http
должна быть зависимость определения проекта,$9c2192aea3f1db3c251d
а не зависимость правильного проекта. Следовательно, он должен быть объявленproject/build.sbt
вместоbuild.sbt
, потому чтоproject
именно там находится проект Scala определения сборки.Чтобы понять, что определение сборки - это просто еще один проект Scala, выполните
sbt consoleProject
. Это загрузит Scala REPL с проектом определения сборки в путь к классам. Вы должны увидеть импорт по строкамИтак, теперь мы можем напрямую взаимодействовать с проектом определения сборки, вызывая его с помощью собственно Scala вместо
build.sbt
DSL. Например, следующее выполняетfooTask
build.sbt
В корневом проекте есть специальный DSL, который помогает определить проект Scala с определением сборкиproject/
.И проект Scala определения сборки, может иметь собственный проект Scala определения сборки
project/project/
и так далее. Мы говорим, что sbt рекурсивен .sbt по умолчанию параллелен
sbt строит DAG из задач. Это позволяет ему анализировать зависимости между задачами и выполнять их параллельно и даже выполнять дедупликацию.
build.sbt
DSL разработан с учетом этого, что может привести к изначально неожиданной семантике. Как вы думаете, какой порядок выполнения в следующем фрагменте?Интуитивно можно подумать, что поток здесь - это сначала печать,
hello
затем выполнениеa
, а затемb
задание. Однако это на самом деле означает , что выполнитьa
иb
в параллель , и прежде , чемprintln("hello")
такили из-за порядка
a
иb
не гарантируетсяКак это ни парадоксально, в sbt проще сделать параллельный, чем последовательный. Если вам нужен серийный заказ, вам придется использовать специальные вещи, такие как
Def.sequential
илиDef.taskDyn
имитация для понимания .похоже на
где мы видим, что между компонентами нет зависимости, в то время как
похоже на
где мы видим,
sum
зависит от и должно ждатьa
иb
.Другими словами
.value
sequential
илиtaskDyn
Рассмотрим еще один семантически сбивающий с толку фрагмент из-за природы построения зависимостей
value
, где вместомы должны написать
Обратите внимание, что синтаксис
.value
касается отношений в группе DAG и не означаетвместо этого это означает что-то вроде
Так что теперь может быть немного яснее, почему
x
еще нельзя присвоить значение; пока нет ценности на стадии построения отношений.Мы ясно видим разницу в семантике между собственно Scala и языком DSL в
build.sbt
. Вот несколько полезных для меня правилSetting[T]
.value
синтаксис, а sbt позаботится об установлении связи междуSetting[T]
Def.sequential
илиDef.taskDyn
Команды против задач
Команды - это ленивый выход из DAG. Используя команды, легко изменить состояние сборки и сериализовать задачи по своему усмотрению. Цена состоит в том, что мы теряем распараллеливание и дедупликацию задач, предоставляемых DAG, поэтому задачи должны быть предпочтительным выбором. Вы можете думать о командах как о чем-то вроде постоянной записи сеанса, который можно делать внутри
sbt shell
. Например, учитываярассмотрим результат следующего сеанса
В частности, не то, как мы изменяем состояние сборки с помощью
set x := 41
. Команды позволяют нам делать постоянную запись вышеуказанного сеанса, напримерМы также можем сделать команду типобезопасной, используя
Project.extract
иrunTask
Области применения
Области видимости вступают в игру, когда мы пытаемся ответить на следующие типы вопросов
sbt имеет многоосное пространство области видимости, по которому можно перемещаться с помощью синтаксиса косой черты , например,
Лично мне редко приходится беспокоиться о размахе. Иногда хочется скомпилировать только тестовые исходники
или, возможно, выполнить конкретную задачу из определенного подпроекта без предварительного перехода к этому проекту с помощью
project subprojB
Я думаю, что следующие практические правила помогут избежать осложнений при оценке объема работ.
build.sbt
файлов, а только один главный в корневом проекте, который контролирует все другие подпроектыval
и явно добавить их в каждый подпроектМногопроектная сборка
Вместо нескольких файлов build.sbt для каждого подпроекта
Имейте одного хозяина,
build.sbt
чтобы управлять ими всемиСуществует обычная практика выделения общих настроек в многопроектных сборках.
например
Навигация по проектам
Плагины
Помните, что определение сборки - это правильный проект Scala, который находится внутри
project/
. Здесь мы определяем плагин, создавая.scala
файлыВот минимальный автоматический плагин под
project/FooPlugin.scala
Отмена
должны эффективно включить плагин для всех суб-проектов без необходимости вызывать явно
enablePlugin
вbuild.sbt
.IntelliJ и sbt
Пожалуйста, включите следующий параметр (который действительно должен быть включен по умолчанию )
под
Ключевые ссылки
источник