【问题标题】:Gradle multi-project build order using Kotlin script使用 Kotlin 脚本 Gradle 多项目构建顺序
【发布时间】:2020-03-03 02:52:58
【问题描述】:

我使用 Kotlin DSL 脚本 (.kts) 进行构建。我的项目结构是:

Root project 'demo'
+--- Project ':backend'
\--- Project ':frontend'

我需要先构建项目frontend,而不是backend。我试过了

include(":frontend")
include(":backend)

include(":frontend", ":backend")

在根项目的 settings.gradle.kts 中有和没有 :,但构建顺序仍然是 字母顺序 - backend,而不是 frontend .

View source code on GitHub

你有什么想法吗?

【问题讨论】:

    标签: java gradle kotlin build


    【解决方案1】:

    没有错。如果您不指定任何项目间依赖关系,Gradle 将按字母顺序执行它们。如果这两个项目不相关,这应该没问题,就像现在一样。

    但是假设您喜欢构建前端(使用节点),然后将这些资源包含在后端(使用 Spring Boot)。然后你需要让后端依赖于前端项目。然后 Gradle 将尊重依赖图并首先构建前端。

    有很多方法可以做到这一点。一种是使用前端的java 插件来构建前端资源的jar 文件。然后,您可以对其进行正常的项目依赖。您也可以将依赖项直接添加到前端项目的“内部”构建任务中,但这有点令人不悦。或者你可以声明你自己的工件,或者以其他不同的方式来做。

    对于第一种方法,您可以像这样构建前端资源的 jar 文件:

    plugins {
        // ...
        id("java")
    }
    
    java {
        // Required to make the jar artifact compatible with your backend, which is configured for Java 1.8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    
    tasks.named("jar", Jar::class) {
        dependsOn("assembleFrontend")
        from("$buildDir/dist")
        into("static")
    }
    

    然后在后端,像这样依赖它:

    dependencies {
        // ...
        runtimeOnly(project(":frontend"))
    }
    
    

    您的构建脚本还有其他一些问题。

    • runtime 配置已弃用;请改用runtimeOnly(用于您的 spring-boot-devtools 依赖项)。
    • 一个多项目应该只有一个 settings.gradle 文件,但每个项目都有一个。删除它们,根文件夹中的除外。
    • 您已经两次声明了org.siouan.frontend 插件:一次使用推荐的方式,一次使用“旧”方式。删除后者(buildscript 块和 apply 语句中的所有内容。

    另外,虽然我不熟悉 org.siouan.frontend 插件,但它似乎没有为您声明输入和输出 - 可能是因为它非常通用。因此,为避免每次构建后端时都运行 npm(因为您现在依赖于前端),您应该为 installFrontendassembleFrontend 等前端任务声明正确的输入和输出。

    【讨论】:

    • 非常感谢!您的建议对解决我的问题和理解 Gradle 的工作都非常有帮助。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多