Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Gradle и решение задач автоматизации

Anna | 4.06.2014 | нет комментариев

Всем здравствуй, сегодня я хотел бы рассказать вам о моём навыке работы с Gradle, не легко переписать мануал (правда он отменно написан), но рассказать с какими реальными загвоздками я столкнулся и как побеждал их, а также показать какие вероятности предоставляет нам Gradle. Тема дюже обширная следственно, к сожалению я не сумею разглядеть многие аспекты детально и ступенчато, верю что читатели теснее немножко знакомы с Gradle и сумеют осознать суть описываемых решений.

Лирика

Значимое примечание по поводу maven — многие задачи которые я делал с поддержкой Gradle я никогда не пытался сделать прежде maven-ом, следственно сравнить многие моменты, что отменнее, а что дрянней я к сожалению не сумею.

Первое, что в нём понравилось, это наконец-то «прощай xml», о да, для меня это подлинно как снова родиться, как же было немыслимо славно писать сборку на реальном языке программирования, какая же это воля и воодушевление.

В статье будут применяться некоторые представления из OSGI и eclipse rcp, я не буду останавливаться на них внимание, Дабы не отвлекаться от основной темы.

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

Масштаб задачи

Выходит, что у нас было сначала: у нас имеется огромная (по моим меркам) система запускаемая на OSGI платформе, планы в системе это eclipse plug-in планы, никакой интеграции с системой сборки нет, в качестве системы сборки применяется ant, системы контроля зависимостей не было. Была задача сделать всё резко.

Выходит я предложил Gradle мне дали добродушно, и началось.

Изложение конструкции планов

Суть задачи в том, что имеется директория с некой конструкцией в которой хранятся планы.
Первое что необходимо было сделать, это описать в скриптах сборки конструкцию директории и все имеющиеся планы. Я это сумел сделать с легкостью. В Gradle для этого применяется представление multi project. В корневой директории создаем файл settings.gradle и записываем пути к всякой папке где лежат планы разграничитель пути «:». Пример settings.gradle:

include "subproject-first"
include "subproject-first:child-first"
include "subproject-first:child-first:another-child:last-child"
include "subproject-first:child-first:another-child:another-last-child"

include "subproject-second"

Сейчас мы можем посмотреть конструкцию нашей системы, исполнив команду:

gradle projects -q

Итог:

image

Настройка IDE

Дальнейшим шагом была вероятность импорта планов в IDE. В Gradle есть плагины для idea и eclipse:
тынц
барабынц

У нас планы дюже жестко завязаны на eclipse из-за osgi, и куска eclipse-rcp тот, что не разрешал легко так взять target platform (это такая ужасная штука из мира osgi, по сути это osgi framework и папка с кучей jar-ников) и применять её в idea, но в всеобщем это лирическое отхождение.

Взяв eclipse плагин я сумел настроить планы именно так как мне нужно было, а нужно было мне сделать планы как eclipse plug-in, прописать в настройках plugin dependencies, указать версию используемого компилятора. Пример настройки:

project.apply plugin: 'java'
project.apply plugin: 'eclipse'
project.apply plugin: 'idea'

project.eclipse {
    jdt { 
        sourceCompatibility = '1.6' 
    }

    project { 
        //применяем натуру и план становится eclipse plug-in
        natures 'org.eclipse.pde.PluginNature' 
    }

    classpath {
        downloadSources = true
        downloadJavadoc = true

        //используем java se 1.6 jre
        containers.clear()
        containers.add("org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6")

        file {
            //ручная правка .classpath добавление plugin-dependencies зависимостей (то есть зависимости от целевой платформы — есть такое представление в osgiи эклипсе)
            withXml {
                Node node = it.asNode()
                node.appendNode('classpathentry', [kind: 'con', path: 'org.eclipse.pde.core.requiredPlugins'])
            }
        }
    }
}

То есть, как видите настроек для eclipse много, а то что невозможно сделать через api eclipse плагина, дозволено сделать вручную поправив xml файл настроек.

Зависимости

Дальнейший шаг, dependency management: документация.

Я прежде думал, что нет ничего отменнее dependency managment в maven, теперь я думаю, что я заблуждался. Gradle может применять зависимости из maven, ivy, и примитивные папки и файлы, да и вообще при желании дозволено сделать, что-то дюже нестандартное, скажем применять ftp сервер в качестве repository. Для примера, как прописываются зависимости:

project(":myproject") {
    dependencies {
        //зависимость от иного плана
        compile project(":other-my-project")

        //берем зависимости из локальной папки
        compile fileTree(dir: "libs", include: "*.jar")
        //берем связанность из maven репозитория
        compile 'org.hibernate:hibernate-core:3.6.3.Final'
    }
}

Но это только предисловие. В Gradle есть представление configurations — это что-то схожее на группы в которые добавляются зависимости. То есть в нашем примере compile это и есть configuration, которую создает java plugin.

Эта вероятность помогла мне прекрасно решить одну задачу с зависимостями, суть этой задачи вот в чем, у нас ядро разрабатывают за рубежом, и итог к нам приходит в виде zip архива, внутри которого имеется уйма разных файлов, в том числе нужный комплект библиотек. Данный архив заливается в artifactory внешними силами, а я в свою очередь получаю его из artifactory, сберегаю его в temp директорию, распаковываю, беру из распакованной папки все нужные мне библиотеки.

Скачивание и распаковка архива:

//получаем путь к temp папке куда будем распаковывать архив
File sdkDir = getSdkDir(sdkVersion)

//создаем нужные нам конфигурации
project.configurations {
    sdk
    libsFromSdk
}

//прописываем artifactory репозиторий откуда будем брать наш архив
project.repositories {
    maven { url 'http://localrepo:8081/artifactory/repo' } 
    mavenCentral()
    mavenLocal()
}

//прописываем связанность
project.dependencies {
    sdk group: 'com.kontora', name: 'sdk', version: sdkVersion, ext: 'zip'
}

Configuration cfg = project.configurations.sdk

//берем zip файл из зависимости
cfg.files.each { File zipArchive ->
    //извлекаем архив в папку
    project.ant.unzip src: zipArchive, dest: sdkDir.absolutePath
}

Обратите внимание, что каждый комплект действий запрограммирован с поддержкой dsl языка Gradle в терминах сборки. Нет необходимости писать свой низкоуровневый код на языке программирования.

Подключение зависимостей в план из распакованного архива:

project.dependencies {
    libsFromSdk project.fileTree(dir: "$pathToSdk/libs", include: "*.jar")
		 …
    //копируем все зависимости из  libsFromSdk в compile конфигурацию
    project.compile  libsFromSdk
}

И результате мы получим все наши зависимости для компиляции.

Я люблю тебя код, что само по себе и не ново

Наши скрипты тем временем растут и возрастают, пора бы и подумать над вопросом копипасты дублирования кода. Представим у нас есть программная система и мы все понимаем, что дублирование кода в системе это нехорошо, но отчего-то дублирование строк текста в настройках системы сборки не считается чем-то неправильным. Я думаю повод этому, изложение сборки в xml, чай xml — это по сути конфигурационные файлы и использовать правила программирования для файлов конфигурации не вовсе правильно. Но совместно с тем писать в сотне файлов идентичный текст конфигурации — это не вовсе прекрасно, трудно для ориентации программиста и может стать поводом неявных и трудно обнаруживаемых ошибок в сборке. В Gradle eсли мы для сборки пишем код, то значит мы сумеем избавиться от дублирования кода конфигурации в системе сборки, стандартным методом, как мы это делаем в обыкновенном коде. И здесь Gradle вновь показал свою мощь и красоту.

Трям.

 

Источник: programmingmaster.ru

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB