Быстрая перезагрузка благодаря встроенному веб-приложению и конвейеру ресурсов в Gradle/Gretty
Я использую Gretty для запуска моего веб-приложения через gradle appRun
, Я также использую плагин Gradle Asset Pipeline для компиляции моих файлов Less в CSS.
Я хочу интегрировать с функцией быстрой перезагрузки Gretty, чтобы при изменении файла Less он автоматически компилировался и копировал CSS в веб-приложение на месте.
Я реализовал решение с помощью Gretty's onScanFilesChanged
установка в моем build.gradle
файл:
buildscript {
dependencies {
classpath 'org.akhikhl.gretty:gretty:1.2.4'
classpath 'com.bertramlabs.plugins:asset-pipeline-gradle:2.7.0'
classpath 'com.bertramlabs.plugins:less-asset-pipeline:2.7.0'
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'war'
apply plugin: 'org.akhikhl.gretty'
apply plugin: 'com.bertramlabs.asset-pipeline'
dependencies {
// ...
}
assets {
excludes = ['bootstrap/**']
}
war.dependsOn assetCompile
gretty {
servletContainer = 'tomcat8'
enableNaming = true
contextPath = '/'
// This affects the war task as well
webappCopy {
from 'build/assets', { into 'stylesheet' }
}
afterEvaluate {
prepareInplaceWebAppFolder.dependsOn assetCompile
}
scanDir "src/assets"
fastReload "src/assets"
onScanFilesChanged { List<String> files ->
if (files.findAll { it.endsWith ".less" }.size() > 0) {
assetCompile.compile()
}
}
}
Есть ли более аккуратный способ сделать это, не задействуя столько кода в build.gradle
файл?
1 ответ
Поведение, которое вы описываете, - это то, что Gretty делает по умолчанию. В документации говорится:
fastReload: при значении true (по умолчанию) папка webAppDir (обычно это src / main / webapp) устанавливается как быстрая перезагрузка. Это означает: всякий раз, когда некоторые файлы в webAppDir изменяются, эти файлы копируются в работающее веб-приложение без перезапуска веб-приложения.
Значит, любое изменение в подкаталоге src/main/webapp
вызовет быструю перезагрузку Gretty, но любое изменение, внесенное вне этого каталога, вызывает перезапуск сервера.
Разумный подход к вашей проблеме будет переопределять выходной путь gradle assetsCompile
в подкаталог src/main/webapp
или подключить к нему задачу копирования следующим образом в файле build.gradle:
task copyAssets(type: Copy) {
from buildDir + '/assets'
into webAppDir + '/stylesheet'
}
copyAssets.shouldRunAfter assetsCompile