位于dist()方法的位置

时间:2014-10-25 15:43:45

标签: gradle

我试图理解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中搜索,但没有这样的方法。那它在哪里宣布?

2 个答案:

答案 0 :(得分:3)

您可以提供您提到的示例的链接吗?

似乎无法定义dist()方法。您提供的代码示例只是一个任务定义,因此在此特定情况下dist只是Zip类型的已定义任务的名称。 frominto方法取自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",这仍然是一个有效的例子,但使用一个不太清楚的任务名称。