Gradle:如何在另一个任务中使用任务的输出文件数据?

时间:2017-08-31 13:38:35

标签: json gradle npm webpack

有问题

我想在warag中的packagind之前更新html文件,以设置对应于JS包编译的HASH变量。

这就是我所拥有的

<img class="logo" src="<?= assets_path('images/logo.png') ?>">

这是我在流程结束时想要的东西

<script th:src="@{/static/js/assistance/manifest.js}" charset="UTF-8"></script>

哈希是在JS编译之后生成的,这是一个gradle任务(见下文),并存储在编译后创建的json文件中。

我尝试过的事情(经过千万次尝试后)

为了通过引用我的带有HASH的JS更新我的所有HTML文件,我试过这个:

<script th:src="@{/static/js/assistance/manifest.hereIsTheHash.js}" charset="UTF-8"></script>

如果我用字符串替换 ext.assistanceJs,ext.manifestJs或ext.vendorJs ,它的效果非常好。

这些变量在另一个读取json文件的任务中定义:

war{

    dependsOn 'createStatsJson'

    filesMatching('WEB-INF/views/**.html'){
        filter {  String line ->
                line = line.replaceAll('assistance.js', ext.assistanceJs)
                line = line.replaceAll('manifest.js', ext.manifestJs)
                line = line.replaceAll('vendor.js', ext.vendorJs)
        }
    }
}

此json文件由另一个任务创建:

task createStatsJson(dependsOn: 'buildAssistanceJS') {
        def jsonFile = file('build/webpack/assistance/stats.json')
        def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
        ext.assistanceJs = parsedJson.assetsByChunkName.assistance[0]
        ext.manifestJs   = parsedJson.assetsByChunkName.manifest
        ext.vendorJs     = parsedJson.assetsByChunkName.vendor
}

问题

不幸的是,它并不像gradle tels me那样json文件不存在。我认为这是一个与构建生命周期相关的问题,但我不知道如何实现这一目标。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

task createStatsJson(dependsOn: 'buildAssistanceJS') {
        def jsonFile = file('build/webpack/assistance/stats.json')
        def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
        ext.assistanceJs = parsedJson.assetsByChunkName.assistance[0]
        ext.manifestJs   = parsedJson.assetsByChunkName.manifest
        ext.vendorJs     = parsedJson.assetsByChunkName.vendor
}

这是createStatsJson任务的配置关闭,而不是执行阶段。

有关详细信息,请参阅Gradle build lifecycle

基本上,当这段代码执行时 - 仍然没有build/.../stats.json(除非它来自之前的构建并且你没有使用干净的任务)。 您需要将此任务更改为

task createStatsJson(dependsOn: 'buildAssistanceJS') {
    doLast {
        def jsonFile = file('build/webpack/assistance/stats.json')
        def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
        ext.assistanceJs = parsedJson.assetsByChunkName.assistance[0]
        ext.manifestJs   = parsedJson.assetsByChunkName.manifest
        ext.vendorJs     = parsedJson.assetsByChunkName.vendor
    }
}

这将在执行阶段的ex.*变量中提供值。 我假设createStatsJson明确依赖于相关的构建任务,以便在执行时出现stats.jsonbuildAssistanceJS我猜)文件。

您的war任务代码遇到同样的问题。代码在配置阶段运行,而不是在执行阶段。

war{

    dependsOn 'createStatsJson'
    doLast {
      filesMatching('WEB-INF/views/**.html'){
          filter {  String line ->
                  line = line.replaceAll('assistance.js', ext.assistanceJs)
                  line = line.replaceAll('manifest.js', ext.manifestJs)
                  line = line.replaceAll('vendor.js', ext.vendorJs)
          }
      }
    }
}

答案 1 :(得分:0)

终于找到了一个有效的解决方案。希望它会有所帮助。

task buildAssistanceJS(dependsOn: 'gulp_less', type: NpmTask) {
    args = ['--prefix', 'src/main/javascript/assistance', 'run', 'build']
}

def assistanceJs = ""
def manifestJs = ""
def vendorJs = ""

task createStatsJson(dependsOn: 'buildAssistanceJS') {
    doLast {
        def jsonFile = file('build/webpack/assistance/stats.json')
        def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
        assistanceJs = parsedJson.assetsByChunkName.assistance[0]
        manifestJs   = parsedJson.assetsByChunkName.manifest
        vendorJs     = parsedJson.assetsByChunkName.vendor
    }
}

war {

    dependsOn 'createStatsJson'

    filesMatching('WEB-INF/views/**.html'){ fichier ->
        fichier.filter {  String line ->
            line = line.replaceAll('assistance.js', assistanceJs)
            line = line.replaceAll('manifest.js', manifestJs)
            line = line.replaceAll('vendor.js', vendorJs)
      }
    }
}