Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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'

Работала как прелесть для меня.