Як я можу імпортувати один сценарій Gradle в інший?


97

У мене є складний скрипт gradle, який охоплює набір функціональних можливостей навколо побудови та розгортання ряду проектів netbeans у багатьох середовищах.

Сценарій працює дуже добре, але по суті все це налаштовано через півдюжини карт, що містять інформацію про проект та навколишнє середовище.

Я хочу абстрагувати завдання в інший файл, щоб я міг просто визначити свої карти у простому файлі збірки та імпортувати завдання з іншого файлу. Таким чином, я можу використовувати ті самі основні завдання для ряду проектів і налаштовувати ці проекти за допомогою простого набору карт.

Хтось може сказати мені, як я можу імпортувати один файл gradle в інший, подібно до завдання Ant? Поки що я не провів жодної роботи з документами Gradle.

Додаткова інформація

Після відповіді Тома нижче, я подумав спробувати пояснити, що саме я маю на увазі.

В основному я маю скрипт gradle, який запускає ряд підпроектів. Однак усі підпроекти - це проекти Netbeans, і вони мають власні сценарії побудови мурашок, тому у мене є завдання у gradle викликати кожен із них.

Моя проблема полягає в тому, що у мене є якась конфігурація у верхній частині файлу, наприклад:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Потім я генерую такі завдання, як:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

У мене є багато подібних фрагментів генерації завдань, і всі вони є загальними - вони повністю залежать від конфігурації у списку проектів.

Тож, що я хочу, це спосіб помістити це в окремий скрипт та імпортувати його таким чином:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

Отже, у цьому прикладі task.gradle матиме весь загальний код генерації завдань і буде запускатись для проектів, визначених у головному файлі build.gradle. Таким чином, task.gradle - це файл, який може бути використаний усіма великими проектами, що складаються з ряду підпроектів із файлами збірки Ant і Netbeans.


3
Розгляньте конструкцію "застосовувати з: 'other.gradle'", щоб імпортувати зовнішні декларації. (Див. "12.4. Налаштування проекту за допомогою зовнішнього сценарію збірки" тут gradle.org/0.9-preview-1/docs/userguide/… )
Петр Гладких,

@PetrGladkikh apply fromнегайно виконує зовнішні завдання. Це може бути не кращим у логіці виконання (тобто я б хотів виконувати завдання, коли захочу, а не відразу).
Ігор Ганапольський

Це твердження у коментарі вище не відповідає дійсності : apply fromнегайно виконує зовнішні завдання. Не вводьте в оману. Зовнішні завдання налаштовуються, а не виконуються.
Ярекчек

Відповіді:



17

Відповідь на запитання виявилася в системі плагінів, де ви можете додати бажану функціональність у набір плагінів, які можуть бути грубовими файлами, розташованими в каталозі buildSrc/src/main/groovy. Плагіни також можна поставити у комплекті з Jar, хоча я цього не пробував.

Деталі тут: Спеціальні плагіни


Щоб ви знали, що посилання порушено - ось оновлення gradle.org/docs/current/userguide/…
JARC

Посилання на плагін: gradle.org/docs/current/userguide/…
JARC

4

Ну, важко сказати, що вам найбільше підходить, фактично не побачивши ваш файл збірки.

Я міг би припустити, що приховування вашого середовища як багатопроектна побудова має забезпечити вам абстракцію, яку ви шукаєте.

У кореневій частині проекту build.gradleви визначаєте всі матеріали, що стосуються вашого домену, а також речі, які стосуються всіх ваших підпроектів:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Кореневий каталог проекту також може містити gradle.propertiesфайл, де ви визначаєте властивості, що використовуються вашими проектами:

buildDirName=staging
repo.dest.dir=/var/repo
...

Потім у додатковому файлі з кореневого каталогу проекту, який settings.gradleви фактично вказуєте на свої підпроекти:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Кожен каталог підпроекту містить build.gradleфайл, що містить лише матеріали, що стосуються підпроекту.

Незалежно від того, чи ви звертаєтесь gradleіз кореневого каталогу проекту або каталогу підпроекту, gradle автоматично розгляне всі ваші визначення, зроблені в різних файлах.

Також зауважте, що жодне завдання компіляції не буде виконуватися для кореня вашого проекту, якщо ви не завантажуєте жоден плагін, окрім плагіна за замовчуванням на кореневому рівні.


1
Дякуємо, що знайшли час відповісти. Я маю проблеми не з підпроектами, а навпаки, створюючи "бібліотеку" загальних завдань. Я відредагував своє оригінальне запитання з додатковою інформацією та фрагментами коду, щоб зробити речі зрозумілішими.
Ентоні Рой,

1
Отже, замість того, щоб виконувати імпорт ("tasks.gradle") із вашого зразка, у вас буде розділ підпроектів {} із зазначенням загального коду генерації завдань, що використовується у всіх ваших підпроектах. Це має забезпечити ту саму абстракцію, яку ви шукаєте !?
Том,

Чи справді тут потрібен плагін Ivy? Чи не можна використовувати Gradle самостійно?
Ігор Ганапольський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.