Как использовать общий файл build.gradle через репозиторий?
Я смотрю на перенос сборки maven на gradle. Одна из особенностей maven - наследование pom, в результате чего я могу объявить о множестве распространенных действий в pom, опубликовать это в репозитории, а затем использовать это через <parent>
в конкретном проекте.
Мое Q просто, есть ли эквивалентное поведение в gradle?
Я ранее делал это в ant + ivy, импортируя общий файл build.xml, который полагался либо на то, что уже проверил местоположение общего файла build.xml из исходного элемента управления, либо использовал что-то вроде svn: externals. Я могу повторить этот подход без каких-либо реальных трудностей, но это похоже на то, что maven делает это довольно хорошо, поэтому было бы неплохо увидеть что-то подобное в gradle.
Ответы
Ответ 1
Мое текущее решение - вариант 3; упакуйте общие скрипты в банку в качестве ресурсов, а затем разделитесь в секции buildscript таким образом
buildscript {
repositories {
// enterprise repo here
}
dependencies {
classpath 'com.foo.bar:common-build:0.1.0-SNAPSHOT'
}
dependencies {
ant.unjar src: configurations.classpath.singleFile, dest: 'build/gradle'
}
}
apply from: 'build/gradle/common.gradle'
Это похоже на то, что я хочу.
Ответ 2
Есть две возможности:
-
Опубликуйте сборку script на веб-сервере и включите ее с помощью apply from: "http://path/to/script.gradle"
-
Запишите плагин Gradle, опубликуйте его как Jar в репозитории Maven или Ivy и включите его с помощью
buildscript {
repositories { .. }
dependencies "mygroup:myplugin:1.0"
}
apply plugin: "myplugin"
Второй вариант более сложный, но также несколько более мощный. Например, плагины Jars будут кэшироваться, тогда как сценарии удаленной сборки в настоящее время не будут. В общем, я рекомендую начать с 1. и перейти к 2. если и когда это станет необходимым. В будущем Gradle, скорее всего, предложит механизм, который сочетает в себе простоту использования 1. с преимуществами 2.
Ответ 3
Здания на решении Matts, я считаю следующее немного чище:
buildscript {
repositories {
<your repos>
}
dependencies {
classpath '<your jar>'
}
}
afterEvaluate { project -> // afterEvaluate for resolving the build script dependency
apply from: project.buildscript.classLoader.getResource('path/to/your/resource/in/the/jar').toURI()
}
Просто мои два цента.: -)
Ответ 4
У меня есть ответ и еще один вопрос:
Во-первых, для доступа к совместно используемому файлу из репозитория (т.е. Nexus) вы можете создать URL-адрес, содержащий запрос:
apply from: 'http://server-url/nexus/service/local/artifact/maven/redirect?r=repository-name&g=group-name&a=build-common&e=gradle&v=LATEST'
Я сделал это для нашего проекта, и он отлично работает. Я могу управлять файлом build-common.gradle в отдельном проекте SVN и загружать его в Nexus в качестве SNAPSHOT. Вышеуказанный URL (с соответствующими значениями, вставленными для 'server-url', 'repository-name' и 'group-name'), находит последнюю версию SNAPSHOT моего .gradle script, которую я загрузил. Не нужно упаковывать его в банку.
Ответ 5
Моя версия:
repositories {
<your repos>
}
configurations {
scripts
}
dependencies {
scripts group: 'org.foo', name: 'build', version: '1.0.0', ext: 'gradle'
// add more scrips if needed
}
configurations.scripts.resolve().each { apply from: it }
Ответ 6
Мне нравится ваш подход @user3394219
Я написал небольшой плагин, делающий аналогичную вещь:
plugins {
id "com.orctom.applyscript" version "1.1"
}
applyscript '{{groupA}}:{{nameA}}:{{versionA}}/{{path-of-fileA.gradle}}'
applyscript '{{groupA}}:{{nameA}}:{{versionA}}/{{path-of-fileB.gradle}}'
applyscript '{{groupA}}:{{nameA}}:{{versionB}}/{{path-of-fileC.gradle}}'
applyscript '{{groupC}}:{{nameD}}:{{versionE}}/{{path-of-fileX.gradle}}'
или
plugins {
id "com.orctom.applyscript" version "1.1"
}
dependencies {
scripts '{{groupA}}:{{nameA}}:{{versionA}}'
scripts '{{groupA}}:{{nameA}}:{{versionB}}'
scripts '{{groupC}}:{{nameD}}:{{versionE}}'
}
applyscript '{{nameA}}-{{versionA}}/{{path-of-fileA.gradle}}'
applyscript '{{nameA}}-{{versionA}}/{{path-of-fileB.gradle}}'
applyscript '{{nameA}}-{{versionB}}/{{path-of-fileC.gradle}}'
applyscript '{{nameD}}-{{versionE}}/{{path-of-fileX.gradle}}'
https://plugins.gradle.org/plugin/com.orctom.applyscript
Ответ 7
Здесь улучшается принятое решение, если у вас в вашем сборке несколько зависимостей:
buildscript {
repositories {
// Repositories
}
dependencies {
classpath 'com.foo.bar:project-extension:1.0.0'
classpath 'com.foo.bar:some-dependency-1:2.0.0'
classpath 'com.foo.bar:other-dependency-1:3.0.0'
}
dependencies {
delete "gradle/ext"
def jars = configurations.classpath.files as List<File>
ant.unjar src: jars.find { it.name.matches '.*project-extension.*' }, dest: 'gradle/ext'
}
}
apply from: 'gradle/ext/common.gradle'
Работала как прелесть для меня.