Как указать свойства групп зависимостей в Gradle?

Используя Gradle, я хотел бы иметь возможность отключить транзитивность для одной группы зависимостей, но при этом разрешить другие. Что-то вроде этого:

// transitivity enabled
compile(
  [group: 'log4j', name: 'log4j', version: '1.2.16'],
  [group: 'commons-beanutils', name: 'commons-beanutils', version: '1.7.0']
)

// transitivity disabled
compile(
  [group: 'commons-collections', name: 'commons-collections', version: '3.2.1'],
  [group: 'commons-lang', name: 'commons-lang', version: '2.6'],
) { 
  transitive = false
}

Gradle не примет этот синтаксис. Я могу заставить его работать, если сделаю следующее:

compile(group: 'commons-collections', name: 'commons-collections', version: '3.2.1') { transitive = false }
compile(group: 'commons-lang', name: 'commons-lang', version: '2.6']) { transitive = false }

Но это требует, чтобы я указал свойство для каждой зависимости, когда я бы предпочел сгруппировать их вместе.

У кого-нибудь есть предложение по синтаксису, который будет работать на этом?


person Ryan Nelson    schedule 11.05.2012    source источник


Ответы (2)


Во-первых, есть способы упростить (или хотя бы сократить) ваши объявления. Например:

compile 'commons-collections:commons-collections:3.2.1@jar'
compile 'commons-lang:commons-lang:2.6@jar'

Or:

def nonTransitive = { transitive = false }

compile 'commons-collections:commons-collections:3.2.1', nonTransitive
compile 'commons-lang:commons-lang:2.6', nonTransitive

Чтобы создать, настроить и добавить сразу несколько зависимостей, вам придется ввести небольшую абстракцию. Что-то вроде:

def deps(String... notations, Closure config) { 
    def deps = notations.collect { project.dependencies.create(it) }
    project.configure(deps, config)
}

dependencies {
    compile deps('commons-collections:commons-collections:3.2.1', 
            'commons-lang:commons-lang:2.6') { 
        transitive = false
    }
}
person Peter Niederwieser    schedule 11.05.2012

Создайте отдельные конфигурации и установите для нужной конфигурации значение «transtive = false». В зависимостях просто включите конфигурации в компиляцию или любую другую конфигурацию, которой они принадлежат.

configurations {
    apache
    log {
        transitive = false
        visible = false //mark them private configuration if you need to
    }
}

dependencies {
    apache 'commons-collections:commons-collections:3.2.1'
    log 'log4j:log4j:1.2.16'

    compile configurations.apache
    compile configurations.log
}

Вышеупомянутое позволяет мне отключить транзитивные зависимости для ресурсов, связанных с журналом, в то время как у меня есть переходный = true по умолчанию, применяемый для конфигурации apache.

Отредактировано ниже в соответствии с комментарием Таира:

это исправит?

//just to show all configurations and setting transtivity to false
configurations.all.each { config->
    config.transitive = true
    println config.name + ' ' + config.transitive
}

и запустить зависимости градации

для просмотра зависимостей. Я использую Gradle-1.0, и он ведет себя нормально с точки зрения отображения зависимостей при использовании как транзитивного false, так и true.

У меня есть активный проект, в котором при переходе к истине с использованием вышеуказанного метода у меня есть 75 зависимостей, а при переходе к ложному - 64.

стоит сделать аналогичную проверку и проверить артефакты сборки.

person skipy    schedule 12.05.2012