有问题
我想在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文件不存在。我认为这是一个与构建生命周期相关的问题,但我不知道如何实现这一目标。
非常感谢任何帮助。
答案 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.json
(buildAssistanceJS
我猜)文件。
您的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)
}
}
}