Создание рабочей конфигурации с дополнительной зависимостью компиляции в Gradle - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь определить сценарий сборки для моих производственных версий.

Ниже приведена структура проекта, все проекты * java плагин.

wrapper (parent)
|--frontend (child)
|  |--src
|  |  |--js (raw ES6 modules)
|  |  |--sass (raw)
|  |--build
|     |--lib
|     |  |--production-front.jar
|     |--dist
|        |--js (bundled)
|        |--css (compiled production)
|--backend (child) (spring boot)
   |--build
      |--lib
         |--RELEASE.jar

Теперь здесь происходит то, что по умолчанию (sourceSets.main.resources.srcDirs) из backend напрямую связано с:

  • необработанный :frontent/src/js
  • сгенерировано :frontent/build/dist/css.

Таким образом, когда вы запустите его, по умолчанию он будет в режиме разработки. Здесь это означает, что это будет:

  • использовать сгенерированные scss-> css файлы (которые являются ресурсами, например, если вы запускаете фоновый gulp-sass, который компилирует его каждый раз, когда вы изменяете scss, css будет обновляться и запускаться, цикл быстрой разработки).
  • использовать raw JS, который компилируется непосредственно в браузере (JSPM, SystemJS, Babel) - поэтому вам нужно только отредактировать :frontent/src/js и обновить страницу.

Хорошо, пока dev - это любовь, мне также нужно скомпилировать для производства. Упомянутая выше структура проекта также показывает, где :frontend генерирует production-front.jar.

Вот дерево сборки java по умолчанию с моими заметками.

enter image description here

EDIT Мне нужно создать зависимость, которая скомпилирует production-front.jar в RELEASE.jar и пропустит указанные подключенные ресурсы.

Обратите внимание, что мне нужно только пропустить эти ресурсы, а не какие-либо другие в main.resources.srcDirs.

Каков правильный способ , чтобы решить эту проблему (тот, который не выполняет задачи, например, удаляет ресурсы dev из .jar и затем вместо этого добавляет другой файл production-front.jar)? Я не могу понять, как мне сделать несколько исходных наборов или конфигураций, которые работают здесь.

1 Ответ

0 голосов
/ 28 октября 2018

После очень глубокого изучения 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:).

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