1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sxfad-gradle-scripts

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Будете ли вы выбирать Maven с наличием Gradle?

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")
}

После выполнения вышеописанных шагов, вы получаете следующие преимущества:

  1. Отредактированный файл build.gradle становится очень простым, требуя внимания лишь к базовым данным и зависимостям;
  2. Для внутреннего использования компании это делает использование Gradle более стандартизованным и удобным;
  3. Поскольку основной файл Gradle размещен на удаленном сервере, его легко обновлять и поддерживать; а благодаря использованию Git, он также имеет функцию управления версиями (что позволяет просматривать историю изменений файла и выполнять откат).

Увидев это, вы уже больше не будете колебаться между выбором Maven и Gradle, возможно, даже полюбите последний.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Gradle в практике стандартизации: изменения, вызванные одной строкой кода! Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/sxfad-gradle-scripts.git
git@api.gitlife.ru:oschina-mirror/sxfad-gradle-scripts.git
oschina-mirror
sxfad-gradle-scripts
sxfad-gradle-scripts
master