感谢 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: Could not find method include() for arguments [{module=commons-io}] on configuration ':runtime' of type org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.
这是预期的还是我错过了任何明显的东西?
最佳答案
Groovy 允许您省略大量大括号和其他不必要的语法,但这也可能会导致不良行为,就像您的情况一样。
通过from(Object, Closure)
创建子CopySpec
的常见方法方法看起来就像您的代码:
[...]
from 'sourcePath' {
// configuration closure
}
[...]
首先传递一个对象,该对象将通过 Project.files()
进行评估,然后传递一个用于配置的闭包。大括号可以省略。简单易行。
但是,在您的示例中,作为对象传递的表达式是一个方法调用,用于在 ConfigurationContainer
中配置 Configuration
,就像以下常见的 Gradle 代码一样:
configurations.runtime {
exclude module: 'xyz'
}
因此,传递的闭包被解释为配置Configuration
(全局,顺便说一句。),而不是配置CopySpec
。处理这个问题的一种方法是显式设置省略的大括号:
[...]
from(configurations.runtime, {
// configuration closure
})
[...]
请注意:使用上面的示例,您将能够使用 exclude()
和 include()
方法,但不能像在你的代码示例!在 CopySpec 中,您只能排除(或包含)文件或文件模式,而不能排除模块。这些方法根本不允许您传递 map ,您需要传递 list of strings或another closure .
关于java - Gradle 排除 VS 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45705239/