我试图理解gradle分布。在 gradle documentation 的第7.3.4节中,出现以下代码示例:
task dist(type: Zip) {
dependsOn spiJar
from 'src/dist'
into('libs') {
from spiJar.archivePath
from configurations.runtime
}
}
我试图找到方法dist()
来了解它的确切功能。我在org.gradle.api.tasks.bundling.Zip中搜索,但没有这样的方法。那它在哪里宣布?
答案 0 :(得分:3)
您可以提供您提到的示例的链接吗?
似乎无法定义dist()
方法。您提供的代码示例只是一个任务定义,因此在此特定情况下dist
只是Zip
类型的已定义任务的名称。 from
和into
方法取自AbstractCopyTask。
修改强>
因此,如上所述dist()
只是一个普通的任务定义,而例如示例中的下一段代码:
artifacts {
archives dist
}
在AbstractProject class:
中定义了专用方法public void artifacts(Closure configureClosure) {
ConfigureUtil.configure(configureClosure, getArtifacts());
}
现在,为什么会出现这个错误:
Could not find method dist() for arguments [{type=class org.gradle.api.tasks.bundling.Zip}, txt, build_275gv6pdo8dsig251h253koq9t$_run_closure2@a81512] on proj ect ':MP'.
此输入发生:
task dist(type: Zip, 'txt')
在脚本解析期间(这是一个动态且相当复杂的过程),上面的声明应该转换为TaskContainer实例上create
个方法之一的调用,其中 dist 是String
类型的任务名称,type: Zip, 'txt'
应作为参数传递。正如您在TaskContainer的文档中所看到的那样,create
( dist - 任务名称)没有String
方法,那么{{1 ( type:Zip - task config),再次是一个String( txt - 冗余/无效参数)。这就是它失败的原因。
如果您对它是如何工作感兴趣,最好将以下代码放在build.gradle中:
Map
并调查堆栈跟踪。它将逐步告诉你它是如何工作的。
答案 1 :(得分:2)
没有dist方法。在此示例中,您使用gradle dsl创建一个名为" dist"的新任务。其类型是" Zip"。
这是通过使用"方法缺失"来实现的。有关详细信息,请参阅http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing。
注意:如果你改变了#34; dist"对于" foo",这仍然是一个有效的例子,但使用一个不太清楚的任务名称。