Порядок сборки нескольких проектов Gradle с использованием скрипта Kotlin - PullRequest
0 голосов
/ 06 ноября 2019

Я использую скрипт Kotlin DSL (.kts) для сборки. Там структура моего проекта:

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

Мне нужно сначала построить проект frontend, чем backend. Я пробовал

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

и

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

с : в settings.gradle.kts корневого проекта и без него, но все же порядок сборки в алфавитном порядке - backend, чем frontend.

Просмотр исходного кода на GitHub

У вас есть идеи, что не так?

1 Ответ

0 голосов
/ 06 ноября 2019

В этом нет ничего плохого. Если вы не укажете никаких межпроектных зависимостей, 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 каждый раз, когда вы создаете свой бэкэнд (поскольку у вас теперь есть зависимость от внешнего интерфейса), вы должны объявить надлежащие входные и выходные данные для задач внешнего интерфейса, такие как installFrontendи assembleFrontend.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...