В конце дня вам нужно запустить некоторый код для создания исходных файлов Scala.
Создание файлов
Как вы знаете, в sbt есть хук для создания исходных файлов под названием sourceGenerators
, который задокументирован в Создание файлов. Вы, как автор плагина, должны предоставить задачу, которая генерирует Seq[File]
под (sourceManaged in Compile).value / "garfield"
, используя генератор кода Slick в качестве реализации по умолчанию. Назовем это generateModel
. Ваш плагин может иметь следующие настройки:
sourceGenerators in Compile += generateModel.taskValue,
generateModel := defaultGenerateModel.value,
defaultGenerateModel := { ... }
Если пользователь сборки хочет перемонтировать generateModel
, он может сделать это следующим образом:
generateModel := {
val file = (sourceManaged in Compile).value / "garfield" / "Foo.scala"
IO.write(file, """case class Foo() {}""")
Seq(file)
}
Если генерация кода содержится в плагине sbt, как указано выше, вам не нужно делать никаких динамических действий. Поскольку play-slick-evolutions-codegen-plugin
зависит от slick-codegen, это не должно быть проблемой.
Динамическая загрузка кода пользователя
Поскольку вопрос напрямую связан с динамической загрузкой пользовательского кода, я бы также добавил несколько указателей на это.
- Один из способов — использовать
sbt.Run
API из существующая конфигурация. Это эквивалентно вызову задачи run
с некоторым настраиваемым параметром. Если вы генерируете код для конфигурации Compile
, использование бегуна для любой конфигурации, которая от него зависит, не будет хорошей идеей.
- Другой аналогичный способ — использовать
sbt.Fork
API. . Форкинг позволяет запускать код вне плагина.
Учитывая, что sbt автоматически упорядочивает задачи на основе зависимостей между ними и запускает несколько задач параллельно, динамическое выполнение кода чревато неожиданными опасностями.
person
Eugene Yokota
schedule
09.01.2015