Как я могу импортировать один скрипт Gradle в другой? - PullRequest
85 голосов
/ 15 февраля 2010

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

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

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

Может кто-нибудь сказать мне, как я могу импортировать один файл Gradle в другой, в аналогичномманера к задаче муравья?До сих пор я безрезультатно просматривал документы Грэдла.

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

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

По сути, у меня есть скрипт gradle, который запускает несколько подпроектов.Однако все подпроекты являются проектами Netbeans и поставляются со своими собственными сценариями сборки ant, поэтому у меня есть задачи для вызова каждого из них.

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

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.

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

Ответы [ 3 ]

113 голосов
/ 07 апреля 2010

В 0.9 появилась новая функция. Вы можете использовать команду apply from: 'other.gradle'.

Прочтите мой вопрос о том же: Есть ли способ разделить / выделить общие части сборки Gradle

13 голосов
/ 30 августа 2011

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

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

4 голосов
/ 19 февраля 2010

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

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

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

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

...