Как импортировать один Gradle script в другой?

У меня есть сложный gradle script, который завершает загрузку функциональности вокруг создания и развертывания нескольких проектов netbeans в нескольких средах.

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

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

Может ли кто-нибудь сказать мне, как я могу импортировать один файл gradle в другой, аналогично заданию Ant? Я до сих пор травлял gradle docs.

Дополнительная информация

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

В основном у меня есть gradle script, который запускает несколько подпроектов. Тем не менее, подпроекты - это все проекты Netbeans и поставляются со своими скриптами сборки Ant, поэтому у меня есть задачи в 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'.
    }
})

У меня есть много подобных описаний генерации задач, и все они являются общими - они полностью зависят от конфигурации в списке проектов.

Итак, я хочу, чтобы это поместить в отдельный script и импортировать его следующим образом:

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.

Итак, в этом примере tasks.gradle будет иметь весь общий код генерации задачи и будет запущен для проектов, определенных в основном файле build.gradle. Таким образом, tasks.gradle - это файл, который может использоваться всеми крупными проектами, которые состоят из нескольких подпроектов с файлами сборки Netbeans Ant.

Ответ 1

Ответ на вопрос оказался в системе плагинов, где вы можете добавить желаемую функциональность в набор плагинов, которые могут быть groovy файлами, расположенными в каталоге buildSrc/src/main/groovy. Плагины также могут быть объединены как Jar, хотя я этого не пробовал.

Подробности здесь: Пользовательские плагины

Ответ 3

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

Я мог предположить, что установка вашей среды в виде многопроектной сборки должна предоставить вам абстракцию, которую вы ищете.

В корневом каталоге проекта 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 автоматически рассмотрит все ваши определения, сделанные в различных файлах.

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