Как поделиться общим build.gradle через репозиторий? - PullRequest
22 голосов
/ 03 марта 2012

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

Мой вопрос: есть ли в Gradle эквивалентное поведение?

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

Ответы [ 8 ]

20 голосов
/ 03 марта 2012

Существует две возможности:

  1. Опубликовать сценарий сборки на веб-сервере и включить его с 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.

13 голосов
/ 22 апреля 2013

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

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()
}

Только мои два цента.: -)

13 голосов
/ 06 марта 2012

Мое текущее решение - вариант 3;упакуйте обычные сценарии в jar как ресурсы, а затем разархивируйте во время раздела 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'

Это похоже на то, что я хочу.

8 голосов
/ 24 февраля 2014

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

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

6 голосов
/ 07 марта 2014

Моя версия:

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 }
2 голосов
/ 30 августа 2016

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

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'

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

1 голос
/ 17 апреля 2018

Непосредственное чтение обычного сценария в банке следующим образом.Распаковка jar-файла не требуется.

применить от: this.getClass (). GetClassLoader (). GetResource ("path to dependency.gradle")

1 голос
/ 14 декабря 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...