Как использовать общий файл build.gradle через repository?

Я смотрю на перенос сборки maven на gradle. Одной из особенностей maven является наследование pom, благодаря чему я могу объявить о множестве распространенных действий в pom, опубликовать это в репозитории, а затем использовать это через элемент в конкретном проекте.

Мой Q просто, есть ли эквивалентное поведение в gradleиенте?

Я ранее делал это в ant + ivy, импортируя общий файл build.xml, который полагался либо на то, что уже проверил местоположение общего файла build.xml из исходного элемента управления, либо использовал что-то вроде svn: externals. Я могу повторить этот подход без каких-либо реальных трудностей, но это похоже на то, что maven делает это довольно хорошо, поэтому было бы неплохо увидеть что-то подобное в gradleле.

Есть две возможности:

  1. Опубликуйте скрипт сборки на веб-сервере и apply from: "http://path/to/script.gradle" его в apply from: "http://path/to/script.gradle"

  2. Напишите плагин Gradle, опубликуйте его как Jar в репозитории Maven или Ivy и включите его с помощью:

     buildscript { repositories { .. } dependencies "mygroup:myplugin:1.0" } apply plugin: "myplugin" 

Второй вариант более сложный, но и несколько более мощный. Например, плагины Jars будут кэшироваться, тогда как сценарии удаленной сборки в настоящее время не будут. В общем, я рекомендую начать с 1. и перейти к 2. если и когда это станет необходимым. В будущем Gradle, скорее всего, предложит механизм, который сочетает в себе простоту использования 1. с преимуществами 2.

Здания на решении Мэтта, я считаю следующее немного чище:

 buildscript { repositories {  } dependencies { classpath '' } } afterEvaluate { project -> // afterEvaluate for resolving the build script dependency apply from: project.buildscript.classLoader.getResource('path/to/your/resource/in/the/jar').toURI() } 

Только мои два цента. 🙂

Мое текущее решение – вариант 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' 

Кажется, я делаю то, что хочу.

У меня есть ответ и еще один вопрос:

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

Моя версия:

 repositories {  } 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 } 

Вот усовершенствование принятого решения, поскольку, когда у вас есть более чем одна зависимость в вашем buildscript:

 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 ant.unjar src: jars.find { it.name.matches '.*project-extension.*' }, dest: 'gradle/ext' } } apply from: 'gradle/ext/common.gradle' 

Работала для меня как шарм.

Мне нравится ваш подход @ 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

Непосредственное чтение общего скрипта в банке, как показано ниже. Распаковать банку не нужно.

apply from: this.getClass (). getClassLoader (). getResource (“путь к dependency.gradle”).

  • заставить Maven скопировать зависимости в target / lib
  • Идея Intellij не может ничего разрешить в maven
  • Импорт зависимостей Maven в IntelliJ IDEA
  • Готово ли Maven для JDK9?
  • Maven Не удалось разрешить зависимости, артефакты не могут быть разрешены
  • Как вы эффективно справляетесь с моментальными снимками maven-3?
  • Как включить тестовые classы в банку Maven и выполнить их?
  • Maven не находит тесты JUnit для запуска
  • Почему Maven загружает maven-metadata.xml каждый раз?
  • Interesting Posts

    constexpr не компилируется в VC2013

    Как открыть новую вкладку с помощью Selenium WebDriver с Java?

    Как установить или изменить версию Java (JDK) по умолчанию на OS X?

    Как скопировать получателей Outlook 2003 в буфер обмена дословно

    Не является ли аргумент шаблона (подпись) части std :: function его типа?

    Как создать пользовательский конвертер в JSF 2?

    Невозможно включить беспроводной Ubuntu 10.04

    Безболезненно конвертировать FLAC в ALAC в Windows?

    Добавление вкладки внутри fragmentа в Android?

    Как удалить выбросы из набора данных

    Как открыть порты на маршрутизаторе для лучшей производительности торрента

    Нет ActionBar в PreferenceActivity после обновления до поддержки библиотеки v21

    mutate_each / summaryise_each в dplyr: как я могу выбрать определенные столбцы и дать новые имена мутированным столбцам?

    Хранить и читать hash и массив в файлах в Perl

    получение результата в DTO с собственным SQL-запросом в спящем режиме

    Давайте будем гением компьютера.