Gradle в практиках стандартизации в Suixingpay: изменения, принесённые одной строкой кода!
Сейчас многие люди всё ещё колеблются между выбором Maven или Gradle. Если вы следили за статьёй "Maven в действии (шестая часть) — Gradle, будущее средств сборки?" от автора книги "Официальное руководство по Maven" Шу Чжоубин на InfoQ, то наверняка согласитесь со следующими мыслями: Gradle слишком гибкий, что может привести к потере контроля. Цитата из статьи:
"Ещё одна проблема с Gradle заключается в его чрезмерной гибкости. Хотя он поддерживает концепцию 'конвенция лучше конфигурации', вы можете видеть из этой статьи, как легко нарушить эти соглашения. Люди любят свободу и предпочитают создавать свои собственные настройки, считая свои потребности уникальными. Однако, если судить по популярности Maven, почти в 95% случаев вам не требуется расширять возможности сборки самостоятельно. Если вы это делаете, это может сделать ваш процесс сборки трудноразумимым. В этом отношении свобода является двусторонним мечом. Gradle предоставляет вам достаточную свободу, а конвенция лучше конфигурации — всего лишь один из вариантов. Это может показаться заманчивым, но также может привести к повторению ошибок Ant."Прежде чем перейти к тому, как мы использовали Gradle для сборки проекта Spring Cloud, вот пример нашего первоначального файла build.gradle
:
buildscript {
ext {
springCloudVersion = 'Edgware.SR3'
springBootVersion = '1.5.9.RELEASE'
REPOSITORY_HOME = "http://maven.aliyun.com"
}
repositories {
maven { url "${REPOSITORY_HOME}/nexus/content/groups/public" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
```apply plugin: 'maven'
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
if (JavaVersion.current().isJava8Compatible()) {
allprojects {
tasks.withType(Javadoc) {
options.encoding = 'UTF-8'
options.addStringOption('Xdoclint:none', '-quiet') // Disable doclint in JDK 1.8
}
}
}
// Import Spring Cloud dependencies
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencyManagement {
resolutionStrategy {
// Check for updates of remote dependencies
cacheChangingModulesFor 0, 'seconds'
cacheChangingModulesFor 0, 'seconds' // Change local caching strategy
}
}
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
bootRepackage {
// By default, a regular JAR file is created
enabled = false
}
// Create an artifact with the source code for easy viewing and debugging
task sourcesJar(type: Jar) {
classifier = 'sources'
from sourceSets.main.allSource
}
// Create an artifact with javadoc for easy viewing of comments
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives jar
archives sourcesJar
archives javadocJar
}
uploadArchives {
repositories {
mavenDeployer {
snapshotRepository(url: "${REPOSITORY_HOME}/nexus/content/repositories/snapshots/") {
authentication(userName: 'xxx', password: 'xxx')
}
repository(url: "${REPOSITORY_HOME}/nexus/content/repositories/releases/") {
authentication(userName: 'xxx', password: 'xxx')
}
}
}
}
version = '0.0.1' // Set version
group = 'com.suixingpay.demo' // Set group ID
description = 'demo' // Set description
``````markdown
реализация('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-web')
compileOnly('org.springframework.boot:spring-boot-configuration-processor')
compileOnly('org.projectlombok:lombok')
testCompile('org.projectlombok:lombok')
testCompile 'org.springframework.boot:spring-boot-starter-test'
На основе вышеуказанного кода можно выделить следующие проблемы:
2. Присутствуют риски из-за жёсткого кодирования, например, при необходимости изменения адреса Maven-репозитория или имени пользователя и пароля требуется уведомление всех участников проекта о необходимости внесения изменений;
3. В отличие от структурной записи в XML файлах Maven, код Gradle за пределами блока buildscript не имеет строгих требований к структуре, что может привести к различиям в подходах каждого разработчика;
4. Трудно определить конфигурацию для каждого плагина, что затрудняет обслуживание и создаёт дискомфорт для тех, кто не знаком с этими плагинами;
5. При увеличении количества проектов возникают множественные повторяющиеся строки кода, что повышает затраты на разработку и обслуживание. Например, если ранее не было требования загружать исходный код и javadoc в Maven-репозиторий, а затем это стало необходимостью, потребуется уведомить всех участников проекта о необходимости внесения изменений.
Наш первый план заключался в разделении вышеуказанного кода на несколько файлов Gradle для различных плагинов и размещении их в директории GRADLE_HOME/init.d/, однако проблема обновлений всё ещё оставалась актуальной.Дополнительно следует отметить порядок загрузки init.gradle: Gradle последовательно проверяет некоторые директории и загружает файлы в порядке их важности. Если в одной директории найдено несколько файлов, они загружаются в алфавитном порядке. Ориентир загрузки следующий:
1. Через параметры -I или --init-script указывается путь к файлу перед началом сборки,
gradle --init-script init.gradle clean
gradle --I init.gradle assembleDebug
2. Загружается USER_HOME/.gradle/init.gradle;
3. Загружаются файлы с расширением .gradle из директории USER_HOME/.gradle/init.d/;
4. Загружаются файлы с расширением .gradle из директории GRADLE_HOME/init.d/.
Позже мы обнаружили, что Gradle позволяет использовать команду apply from для загрузки внешних файлов Gradle, даже находящихся на удалённых HTTP-серверах. Это открыло новые возможности для решения вышеупомянутых проблем.Сначала содержание файла `build.gradle` следует разделить на несколько отдельных файлов:
1. Разместите код, связанный с Maven, в файле [maven.gradle](https://github.com/sxfad/gradle-scripts/blob/master/maven.gradle);
2. Так как Java, Spring Boot и Spring Cloud являются самыми часто используемыми плагинами, мы поместили все относящиеся к ним скрипты в один файл: [spring-cloud.gradle](https://github.com/sxfad/gradle-scripts/blob/master/spring-cloud.gradle). Однако версии Spring Boot и Spring Cloud могут различаться в зависимости от проекта, поэтому их следует выделить отдельно, например: [spring-cloud-dalston-sr4.gradle](https://github.com/sxfad/gradle-scripts/blob/master/spring-cloud-dalston-sr4.gradle), [spring-cloud-edgware.gradle](https://github.com/sxfad/gradle-scripts/blob/master/spring-cloud-edgware.gradle).
Затем внесите разделенные файлы в git-репозиторий и отредактируйте файл `build.gradle`.```groovy
buildscript {
ext {
sxGradleHome = "https://raw.githubusercontent.com/sxfad/gradle-scripts/master/"
}
apply from: sxGradleHome + 'maven.gradle'
apply from: sxGradleHome + 'spring-cloud-edgware.gradle' // import for using Spring Cloud and corresponding versions of Spring Boot
repositories {
maven { url REPOSITORY_URL }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply from: sxGradleHome + 'maven.gradle'
apply from: sxGradleHome + 'spring-cloud.gradle'
version = '0.0.1' // Setting the version
group = 'com.suixingpay.demo' // Setting the group ID
description = 'demo' // Setting the description
dependencies {
implementation('org.springframework.boot:spring-boot-starter-actuator')
implementation('org.springframework.boot:spring-boot-starter-web')
annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')
annotationProcessor('org.projectlombok:lombok')
testImplementation('org.projectlombok:lombok')
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
После выполнения вышеописанных шагов, вы получаете следующие преимущества:
build.gradle
становится очень простым, требуя внимания лишь к базовым данным и зависимостям;Увидев это, вы уже больше не будете колебаться между выбором Maven и Gradle, возможно, даже полюбите последний.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )