1

我正在使用 Gretty 通过gradle appRun. 我还使用Gradle Asset Pipeline 插件将我的 Less 文件编译为 CSS。

我想与Gretty 的快速重新加载功能集成,这样当我更改 Less 文件时,它会自动编译它并将 CSS 复制到就地网络应用程序。

我已经在我的文件中使用 Gretty 的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文件中的太多代码?

4

1 回答 1

0

您所描述的行为是 Gretty 默认执行的操作。该文档指出:

fastReload:当设置为 true(默认)时,webAppDir 文件夹(通常是 src/main/webapp)被设置为快速重新加载。这意味着:每当 webAppDir 中的某些文件发生更改时,这些文件都会被复制到正在运行的 web-app 中,而无需重新启动 web-app。

意味着,子目录中的任何更改src/main/webapp都会触发 Gretty 的快速重新加载,但是在此目录之外进行的任何更改都会触发服务器重新启动。

解决问题的更聪明的方法是覆盖 的gradle assetsCompile子目录的输出路径src/main/webapp,或者在 build.gradle 文件中像这样将复制任务挂接到它:

task copyAssets(type: Copy) {
    from buildDir + '/assets'
    into webAppDir + '/stylesheet'
}

copyAssets.shouldRunAfter assetsCompile
于 2018-04-19T18:42:08.743 回答