Java GRADLE任务运行配置
我有一个由两部分组成的项目:SpringBoot和React。 在我的Spring Boot build.gradle配置中,我指定了构建和运行应用程序应该执行的操作 下面是它的样子:Java GRADLE任务运行配置,java,reactjs,spring,gradle,build.gradle,Java,Reactjs,Spring,Gradle,Build.gradle,我有一个由两部分组成的项目:SpringBoot和React。 在我的Spring Boot build.gradle配置中,我指定了构建和运行应用程序应该执行的操作 下面是它的样子: plugins { id 'org.springframework.boot' version '2.2.5.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' id "
plugins {
id 'org.springframework.boot' version '2.2.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id "com.github.node-gradle.node" version "2.2.4"
}
group = 'com.vtti'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.apache.poi:poi:3.10-FINAL'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
compile 'org.apache.poi:poi:3.10-FINAL'
compile 'org.apache.poi:poi-ooxml:3.10-FINAL'
compile 'com.sendgrid:sendgrid-java:4.1.2'
compile 'org.json:json:20190722'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.11.0'
}
test {
useJUnitPlatform()
}
node {
// Version of node to use.
version = '10.16.3'
// Version of Yarn to use.
yarnVersion = '1.21.1'
// Base URL for fetching node distributions (change if you have a mirror).
distBaseUrl = 'https://nodejs.org/dist'
// If true, it will download node using above parameters.
// If false, it will try to use globally installed node.
download = true
// Set the work directory for unpacking node
workDir = file("${project.buildDir}/nodejs")
// Set the work directory for YARN
yarnWorkDir = file("${project.buildDir}/yarn")
// Set the work directory where node_modules should be located
nodeModulesDir = file("${project.projectDir}")
}
task appYarnInstall(type: YarnTask) {
description = "Install all dependencies from package.json"
workingDir = file("${project.projectDir}/src/main/client")
args = ["install"]
}
task appYarnBuild(type: YarnTask) {
description = "Build production version of the React client"
workingDir = file("${project.projectDir}/src/main/client")
args = ["run", "build"]
}
task copyClient(type: Copy) {
from 'src/main/client/build'
// into 'build/resources/main/static/.'
into 'src/main/resources/static/.'
}
appYarnBuild.dependsOn appYarnInstall
copyClient.dependsOn appYarnBuild
compileJava.dependsOn copyClient
当我运行gradlew build时,一切正常,Gradle执行纱线安装、纱线构建等
然而,当我运行gradlew bootRun并只想编译和运行一个项目时,它会再次执行所有的操作并构建一个新的前端,这会导致多个更改的文件,这些文件对git是可见的,应该再次提交
是否可以指定何时运行任务,并且只在gradlew build上运行任务,而不在gradlew bootRun上运行任务?您可以使用-x命令行选项并提供要排除的任务的名称来排除正在执行的任务 e、 g。
gradle bootRun-x appYarnInstall您可以使用-x命令行选项并提供要排除的任务的名称来排除正在执行的任务 e、 g。
gradle bootRun-x appYarnInstall以前有人问过这个问题,但在您的特定情况下,这可能就是您想要的:
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(bootRun)) {
tasks.withType(YarnTask){
enabled = false
}
}
}
以前有人问过这个问题,但在您的具体情况下,这可能就是您要寻找的:
gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(bootRun)) {
tasks.withType(YarnTask){
enabled = false
}
}
}
像这样的问题经常出现,答案几乎总是针对症状而不是实际原因。大多数解决方案将包括以下渐变功能之一: 命令行选项-x或其程序等效项gradle.startParameter.excludedTaskNames 直接访问gradle.taskGraph 任务的onlyIf子句 在大多数情况下,这些解决方案实际上是肮脏的黑客行为,以后可能会也可能不会适得其反 许多情况下的实际问题是任务配置和连接方式错误。Gradle世界中一个常见的误解是,只有少数任务可以从命令行调用。基于这一假设,整个构建脚本是围绕这些任务设计的,通常只有来自Java插件的任务构建。在这些情况下,整个构建脚本由dependsOn语句组成,这些语句在调用gradlebuild时以正确的顺序执行任务。您的问题集中在命令上,而不是任务gradlew build和gradlew bootRun,显示了相同的问题: 是否可以指定何时运行任务,并且只在gradlew build上运行任务,而不在gradlew bootRun上运行任务 对于你的问题,一个更好的问题是: 是否可以仅在需要运行时运行任务appYarnInstall和appYarnBuild 正如您在问题中所解释的,实际问题是由任务再次运行这一事实引起的。那么,也许我们应该弄清楚他们什么时候需要逃跑?如果我正确理解您的项目结构,则有两种情况需要运行它们: 如果前端根本不存在,例如在新的结账台上 如果某些前端源文件发生更改 现在,您可以在构建脚本中实现此逻辑,但Gradle提供了开箱即用的功能。您只需要定义创建文件的任务的输入和输出,Gradle就会知道任务何时需要运行 由于我不完全了解您的哪些任务处理哪些文件,并且我不熟悉Gradle Node插件,因此我很难给您提供一个完全工作的构建脚本,但让我给您一些提示: 不要将Gradle处理的源目录与Node或Thread等外部系统处理的源目录混合使用。workingDir hack是必要的,因为这些工具需要另一个存储库布局。在当前设置中,任务结果最终位于源目录src/main/client/build中 不要使用Copy类型的任务。相反,请定义任务appYarnBuild的输出,并将此任务用作processResources的附加输入。这也消除了任务对compileJava的依赖性 始终将任务的结果存储在buildDir中,而不是存储在src的子文件夹中。通过这种方式,您可以始终使用gradle clean build创建干净的构建。如果任务在src内创建文件,则在清理期间不会删除这些文件,并且可能会在以后的生成中导致问题
像这样的问题经常出现,答案几乎总是针对症状而不是实际原因。大多数解决方案将包括以下渐变功能之一: 命令行选项-x或其程序等效项gradle.startParameter.excludedTaskNames 直接访问gradle.taskGraph 任务的onlyIf子句 在大多数情况下,这些解决方案实际上是肮脏的黑客行为,以后可能会也可能不会适得其反 许多情况下的实际问题是任务配置和连接方式错误。Gradle世界中一个常见的误解是,只有少数任务可以从命令行调用 . 基于这一假设,整个构建脚本是围绕这些任务设计的,通常只有来自Java插件的任务构建。在这些情况下,整个构建脚本由dependsOn语句组成,这些语句在调用gradlebuild时以正确的顺序执行任务。您的问题集中在命令上,而不是任务gradlew build和gradlew bootRun,显示了相同的问题: 是否可以指定何时运行任务,并且只在gradlew build上运行任务,而不在gradlew bootRun上运行任务 对于你的问题,一个更好的问题是: 是否可以仅在需要运行时运行任务appYarnInstall和appYarnBuild 正如您在问题中所解释的,实际问题是由任务再次运行这一事实引起的。那么,也许我们应该弄清楚他们什么时候需要逃跑?如果我正确理解您的项目结构,则有两种情况需要运行它们: 如果前端根本不存在,例如在新的结账台上 如果某些前端源文件发生更改 现在,您可以在构建脚本中实现此逻辑,但Gradle提供了开箱即用的功能。您只需要定义创建文件的任务的输入和输出,Gradle就会知道任务何时需要运行 由于我不完全了解您的哪些任务处理哪些文件,并且我不熟悉Gradle Node插件,因此我很难给您提供一个完全工作的构建脚本,但让我给您一些提示: 不要将Gradle处理的源目录与Node或Thread等外部系统处理的源目录混合使用。workingDir hack是必要的,因为这些工具需要另一个存储库布局。在当前设置中,任务结果最终位于源目录src/main/client/build中 不要使用Copy类型的任务。相反,请定义任务appYarnBuild的输出,并将此任务用作processResources的附加输入。这也消除了任务对compileJava的依赖性 始终将任务的结果存储在buildDir中,而不是存储在src的子文件夹中。通过这种方式,您可以始终使用gradle clean build创建干净的构建。如果任务在src内创建文件,则在清理期间不会删除这些文件,并且可能会在以后的生成中导致问题