How to specify properties on groups of dependencies in Gradle?

狂风中的少年 提交于 2019-12-07 22:25:55

问题


Using Gradle, I'd like to be able to disable transitivity on one group of dependencies, while still allowing on others. Something like this:

// 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 won't accept this syntax. I can get it to work if I do this:

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 }

But that requires me to specify the property on each dependency, when I'd rather group them together.

Anyone have a suggestion for a syntax that will work on this?


回答1:


First, there are ways to simplify (or at least shorten) your declarations. For example:

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

In order to create, configure, and add multiple dependencies at once, you'll have to introduce a little abstraction. Something like:

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



回答2:


Create separate configurations, and have transitive = false on the desired configuration. In the dependencies, simply include configurations into compile or any other configuration they belong to

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
}

The above lets me disable the transitive dependencies for log related resources while I have the default transitive = true applied for apache configuration.

Edited Below as per tair's comment:

would this fix?

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

and run gradle dependencies

to view the dependencies. I am using Gradle-1.0 and it behaves ok as far as showing the dependencies is concerned, when using both transitive false and true.

I have an active project where when turning transitive to true using above method, I have 75 dependencies and I have 64 when transitive to false.

worth doing a similar check with and check the build artifacts.



来源:https://stackoverflow.com/questions/10554105/how-to-specify-properties-on-groups-of-dependencies-in-gradle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!