После очень глубокого изучения Gradle в течение прошлой недели (эта тема была создана, потому что я был близок к своей кончине), я наконец нашел очень удовлетворительное решение.
Я хотел бы поделиться тем, что быломои цели и окончательное решение:
- иметь наименьший возможный build.gradle
- иметь возможность развиваться с
build --continuous
- сделать так, чтобы
eclipse
плагин (вероятно, также другие IDE) могут идеально отражать чистую командную строку Gradle разработки с собственной системой сборки.
Это мульти-проект, одним из которых является Spring Boot-приложение с DevTools.
wrapper (parent)
|--frontend (child)
| |--src-client
| | |--static
| | | |--img (images)
| | | \--js (raw ES6 modules)
| | \--sass (raw, note not in static folder)
| \--build
| |--lib
| | \--front.jar
| |--dist
| | |--js (bundled, minimized)
| | \--css (compiled production, minimized)
| \--dev
| \--css (compiled dev, compact readable format)
\--backend (child) (spring boot)
|--src
| |--main/java
| |--main/resources
| \--test/java
\--build
\--lib
\--application.jar
Как я уже описал, цели заключались в следующем:
- Запускать
bootRun
с raw исходниками для js и скомпилированными css, но также с каждым ресурсом, включенным в backend
main
. bootJar
компилировать в производство с зависимостью от скомпилированного front.jar
вместо всего, что используется в dev (предыдущий пункт).
Я используюd комбинация конфигураций, свойств sourceSets и bootRun (+ много времени).
Вот файлы (урезанные):
wrapper / build.gradle
wrapper.gradleVersion '5.0-milestone-1'
allprojects {
apply plugin: 'eclipse'
}
оболочка / фронт / build.gradle
plugins {
id 'java' // possibly use java-base or just custom zip task, since client doesn't actually compile java
}
jar {
dependsOn buildProduction // task that compiles my stuff into build/dist
baseName 'front'
classifier 'SNAPSHOT-' + new Date().format('yyyyMMddHHmmss')
from(buildDir.absolutePath + '/dist') {
into 'static'
}
}
// Note there is a lot of other tasks here that actually compile my stuff, like gulp-sass and JSPM bundling with babel transpiler.
оболочка / backend / build.gradle
buildscript {
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.1.0.RC1'
}
}
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 10 // eclipse has (or had) problems with Java 11
targetCompatibility = 10
sourceSets {
// 'java' plugin adds default main sourceSet
dev {
resources.srcDirs = [
project(':front').projectDir.absolutePath + '/src-client',
project(':front').buildDir.absolutePath + '/dev'
]
}
}
bootJar {
baseName 'application'
classifier 'SNAPSHOT-' + new Date().format('yyyyMMddHHmmssSSS')
// I used bootArchives since it was already there and my stuff fits description, you can also define your own configuration and extend runtime one.
classpath configurations.bootArchives
}
bootRun {
sourceResources sourceSets.dev // I make bootRun (dev) use dev sourceSet
}
dependencies {
runtime 'org.springframework.boot:spring-boot-devtools'
// Since bootArchives configuration is used only by bootJar (not bootRun), this will be only in final fat .jar
bootArchives project(':front')
...
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
Ссылка, которая помогла: http://mrhaki.blogspot.com/2014/09/gradle-goodness-adding-dependencies.html
Обратите внимание, что исходная папка клиента называется src-client
: это ключ для создания " perfect mirror" в затмении.Если бы мы назвали его src
, который уже используется main
в backend
, eclipse вырвет с именем clash (что, вероятно, можно исправить, настроив плагин eclipse, но опять же - мы хотели бы сохранить его простым, безКонфигурации IDE).
В качестве окончательного результата мы получаем очень хорошую разработку командной строки с непрерывным построением gradle, а также ТОЧНО отраженным поведением в eclipse, в котором его конфигурация по умолчанию работает аналогичным образом (но вместо компоновщика gradle используется компоновщик eclipse),Мы также получаем хорошие связанные папки в проекте backend
с источниками, используемыми из front
.То же самое, вероятно, относится к IDEA:).