在其他任务中创建的文件未与 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.
我正在尝试使用我的 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.