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

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

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

Как лучше всего добиться этого в Gradle?


person Andrey Adamovich    schedule 02.04.2010    source источник


Ответы (2)


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

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

person Adam Murdoch    schedule 05.04.2010
comment
Спасибо за ссылку. Как вы думаете, 0.8 поддерживает эту функцию? - person Andrey Adamovich; 05.04.2010
comment
Нет, это новая функция в 0.9 - person Adam Murdoch; 06.04.2010
comment
grrrr, ссылка неработала, теперь нужно копать самостоятельно. - person Dean Hiller; 03.05.2012
comment
Я импортировал файл с некоторыми общими функциями в нем, но я не могу вызывать функции - person Gavriel; 27.11.2014
comment
@box эта ссылка сейчас не работает - person GreenGiant; 26.04.2016
comment
Фантастический ответ. Спасибо. - person sagneta; 11.05.2018
comment
apply from: и что дальше? Как мне использовать эту штуку с dependsOn. - person Erik Aigner; 11.06.2018
comment
@Gavriel Я наконец справился. пример: ext.repo = {it.repositories {maven {name 'proxy' url 'nexus.pagseguro. intranet / repository / public '}}} и используйте его так: (после применения от) buildscript rootProject.ext.repo - person Tonsic; 18.07.2018

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

def getVersionName = { testParam ->
    println "${testParam}"

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

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

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

Тогда versionName получит результат вызова.

Примечания:

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

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

person Laur Ivan    schedule 30.11.2014
comment
На самом деле я нашел это более полезным, чем другой ответ, для совместного использования вспомогательных методов сценария сборки между проектами. - person Travis Castillo; 07.01.2015
comment
Этот ответ оказался для меня самым полезным. Спасибо! - person Billy Lazzaro; 23.03.2015
comment
можешь привести не андроидный пример? что такое versionName VERConsts ['NAME_CALL'] ()? как запустить его в чистом проекте Java Gradle? - person Kamil Nękanowicz; 01.03.2017
comment
Я пытаюсь использовать эту логику применения other.gradle. Есть ли способ применить из other.gradle, содержащегося в качестве ресурса в файле jar, втянутом в качестве зависимости? - person Andy Dingfelder; 12.07.2018