Gradle排除VS include

时间:2017-08-16 04:42:20

标签: java gradle build include

感谢this question上的答案,以下作品:

task copyToLib(type: Copy) {
    into "$buildDir/myapp/lib"
    from configurations.runtime {
        exclude module: 'commons-io'
    }
}

我认为以下内容也应该有效(包括而不是排除):

task copyToLib(type: Copy) {
    into "$buildDir/myapp/lib"
    from configurations.runtime {
        include module: 'commons-io'
    }
}

但我收到了以下错误:

  

org.gradle.internal.metaobject.AbstractDynamicObject $ CustomMessageMissingMethodException:无法在配置':runtime'上找到参数[{module = commons-io}]的方法include()。类型为org.gradle.api.internal.artifacts.configurations.DefaultConfiguration。

这是预期还是我遗漏了什么明显的东西?

1 个答案:

答案 0 :(得分:1)

Groovy允许您省略许多大括号和其他不必要的语法,但这也可能导致意外行为,例如您的情况。

通过from(Object, Closure)方法创建子CopySpec的常用方法与您的代码类似:

[...]
    from 'sourcePath' {
        // configuration closure
    }
[...]

首先传递一个对象,它将通过Project.files()进行评估,然后传递一个闭包进行配置。大括号可以省略。易于peasy。

但是,在您的示例中,作为对象传递的表达式是一个方法调用,用于在ConfigurationContainer中配置Configuration,就像下面常见的Gradle代码一样:

configurations.runtime {
    exclude module: 'xyz'
}

因此,传递的闭包是解释为配置Configuration(全局,顺便说一句。)而不是配置CopySpec。处理此问题的一种方法是显式设置省略的大括号:

[...]
    from(configurations.runtime, {
        // configuration closure
    })
[...]

请注意:使用上面的示例,您可以同时使用exclude()include()方法,但不能在代码示例中使用它们!在CopySpec中,您只能排除(或包含)文件或文件模式,而不能排除模块。这些方法根本不允许您传递地图,您需要传递list of stringsanother closure