Как использовать плагин SBT в собственном проекте плагина?

Я делаю первые шаги с плагином SBT.

object WoahPlugin extends Plugin {
  override lazy val settings = commands += thingCommand

  lazy val thingCommand = Command.command("thing") {state: State =>
    println("this is the thing~!")
    state
  }
}

После определения команды я хочу попробовать. Нужно ли мне создавать плагин и определять новый проект, который его использует, чтобы попробовать? Или я могу открыть сессию SBT в проекте плагина и импортировать его напрямую?

Ответ 1

tl; dr У вас не может быть проекта плагина и его можно протестировать без использования другого проекта.

Плагин улучшает определение сборки проекта, поэтому вы настраиваете плагин, который расширяет проект с помощью возможностей, которые вы хотите - дополнительные настройки и задачи. См. Plugins в официальной документации sbt.

Вы устанавливаете плагины в метапроекте в каталоге project, обычно в project/plugins.sbt (но любой файл project/*.sbt).

Если вам нужно протестировать плагин, у вас есть два заметных варианта, которые все сводятся к тому, чтобы иметь отдельный проект для плагина, а другой - использовать его - выбор касается места, где тестовый проект по сравнению с тестируемого проекта плагинов.

Проект плагинов в метапроекте project

У вас могут быть источники плагина под project/src/main/scala, поэтому они принадлежат к их собственному проекту, но из-за каталога, в котором они живут в project, они автоматически становятся частью метапроекта для другого проекта на один уровень вверх.

С источниками плагина внутри метапроекта project вы можете определить зависимость плагина в project/plugins.sbt и установить плагин (с учетом последних изменяется на sbt с 0.13.5, это не обязательно означает, что плагин включен).

Проект плагина в любом месте

Проект плагина представляет собой проект sbt и, как таковой, можно ссылаться на другой проект sbt с помощью ProjectRef. Если это проект git:// или file://, вы объявляете зависимость от проекта плагина, используя dependsOn и ссылку на проект с помощью ProjectRef.

См. Можно ли использовать несколько проектов из GIT в качестве зависимостей SBT? и Как можно удалить артефакты зависимостей sbt git?.