感谢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。
这是预期还是我遗漏了什么明显的东西?
答案 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 strings或another closure。