У меня есть проект, основанный на SBT-Web и Play Framework. Ну, Play используется только для разработки, затем (при запуске команды stage
в SBT/Activator) все экспортируется на статические страницы и развертывается на каком-то веб-сервере, который, возможно, даже не установлен на Java.Создание статических активов из SBT Web
Мой текущий подход добавляет resourceGenerator:
resourceGenerators in Assets += Def.task {
for(year <- PageGenerator.Years) yield {
val file = (resourceManaged in Assets).value/"assets"/s"${year.year}.html"
println(s"Writing $file…")
IO.write(file, PageGenerator.forYear(year))
file
}
}.taskValue
Это работает прямо сейчас, но она имеет некоторые недостатки:
- Прежде всего, я не могу использовать подкаталоги. Когда я пытаюсь поместить файл в подкаталог, он помещается в root.
- Когда я изменяю шаблон или исходные данные, мне необходимо перезагрузить проект, чтобы он стал эффективным.
- Последнее, я бы немного оценил использование Twirl или что-то подобное там.
Как преодолеть эти недостатки? (Первый из них наиболее важен. Решение других недостатков является скорее меньшим преимуществом.)
- Я попытался привести генерирующий код к стадии трубопровода. Это работает при создании финального артефакта, но во время разработки оно не работает.
- Идея: используйте шаблон Twirl, динамически вызывайте его во время разработки и вызывайте его каким-то образом (используя некоторый ClassLoader и Reflection API) на стадии конвейера. Я не уверен, что это правильный путь. Я уверен, что код Scala/Twirl уже скомпилирован при выполнении этапов конвейера sbt-web?
- Хакерная идея: сгенерируйте файлы для запуска проекта, динамически передайте их по маршрутам в режиме разработки, переименуйте их на стадии конвейера. Это тяжелый взлом, но он должен работать теоретически.