Быстрая перезагрузка благодаря встроенному веб-приложению и конвейеру ресурсов в 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
Другие вопросы по тегам