Есть ли способ разделить/разделить общие части сборки Gradle

У нас есть несколько независимых построений (каждая независимая сборка представляет собой многопроектную сборку). Основные скрипты сборки становятся довольно большими, так как у нас есть набор общих задач, повторно используемых подпроектами, а также много повторений между независимыми сборками. Мы ищем:

  • Способ разделения основного файла сборки в меньшие файлы
  • Способ повторного использования некоторых частей строить в других независимых сборках

Каков наилучший способ достичь этого в Gradle?

Ответ 1

Gradle 0.9 позволяет импортировать сборку script из другой сборки script. Посмотрите: Конфигурирование проекта с использованием внешней сборки script. В основном это apply from: 'other.gradle'.

В руководстве пользователя не упоминается, что параметр "from" может быть URL-адресом, поэтому вы можете сделать ваши общие скрипты доступными через HTTP где-нибудь (например, ваш репозиторий subversion) и импортировать их из нескольких сборок.

Ответ 2

Решение, которое я нашел, подразумевает отображение вещей, которые у вас есть в вашем файле other.gradle.

def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}
ext{
    VERConsts = [:]
    VERConsts['NAME'] = getVersionName()
    VERConsts['NAME_CALL'] = getVersionName
}

Затем в файле build.gradle:

apply from: 'other.gradle'
// ...
android {
    defaultConfig {
        versionName VERConsts['NAME_CALL']()
        // or
        versionName VERConsts['NAME']
    }
}

Затем versionName будет иметь результат вызова.

Примечания:

  • VERConsts['NAME'] = getVersionName() вызовет getVersionName() и сохранит его результат. Используя его в script, например. versionName VERConsts['NAME'] затем назначит сохраненное значение.
  • VERConsts['NAME_CALL'] вместо этого сохранит ссылку на функцию. Использование VERConsts['NAME_CALL']() в вашем script фактически вызовет функцию и назначит результат вашей переменной

Первое приведет к тому, что в script будет присвоено то же значение, в то время как последнее может привести к разным значениям (например, если кто-то нажал другую версию, пока работает script).