在其他任务中创建的文件未与 bootRun 一起打包

Files created in other tasks not packed with bootRun

我正在尝试使用我的 spring 后端构建和打包 React 应用程序(以便它们可以托管在一起)。我在 src/main/js 下有 React 应用程序,我需要做的是构建它,然后将构建文件夹的内容复制到 resources/static,然后从那里复制 index.html 到 resources/templates(所以我的主 spring 控制器可以提供服务)

我遵循了该主题中的多个教程,尽管没有一个完全有效,但我设法想出了这个解决方案(只添加了我 build.gradle.kts 的任务部分:

val jsDir = "src/main/js"
val staticDir = "src/main/resources/static"
val templatesDir = "src/main/resources/templates"

tasks.register<YarnTask>("installDependencies") {
    args.set(listOf("install"))
    execOverrides.set {
        setWorkingDir(jsDir)
    }
}

tasks.register<YarnTask>("buildReact") {
    dependsOn("installDependencies")
    args.set(listOf("build"))
    execOverrides.set {
        setWorkingDir(jsDir)
    }
}

tasks.register<Delete>("preCleanup"){
    delete(staticDir)
    delete(templatesDir)
    mkdir(staticDir)
    mkdir(templatesDir)
}

tasks.register<Delete>("cleanup"){
    delete("$staticDir/index.html")
    delete("$jsDir/build")
}

tasks.register<Copy>("copyBuild"){
    dependsOn("buildReact")
    from("$jsDir/build")
    into(staticDir)
}

tasks.register<Copy>("copyTemplate"){
    dependsOn("copyBuild")
    from("$staticDir/index.html")
    into(templatesDir)
    finalizedBy("cleanup")
}

tasks.register<Task>("buildWeb"){
    dependsOn("preCleanup")
    finalizedBy("copyTemplate")
}

tasks.bootRun{
    dependsOn("buildWeb")
}

(我正在使用 this Gradle 节点插件)

查看我的文件,构建成功,但是当我导航到我的应用程序的 url 时,我要么看到错误页面(在第一次构建时),要么看到我的 React 应用程序的先前版本。几乎看起来 bootRun 任务在 运行 我的任务之前保存了文件的状态,所以它总是得到以前版本的反应文件

我可以通过创建一个新任务来解决这个问题,该任务取决于我的 buildWeb 并由 bootRun 完成,但如果 bootRun 可以自动完成工作会更好.

tasks.register<Task>("bootRunWithWeb"){
    dependsOn("buildWeb")
    finalizedBy("bootRun")
}

bootRun 在其类路径上有主要源集的输出,但您正在将内容复制到其输入位置之一。将资源从输入位置复制到输出位置的是 processResources 任务。如果 processResources 在您将文件添加到 src/main/resources 之前运行,将丢失新文件。

要解决此问题,您可以使 processResources 依赖于 buildWeb,也可以将文件复制到 sourceSets.main.output.resourcesDir.