为maven.url解释Gradle DSL魔法

时间:2017-04-21 07:16:31

标签: gradle groovy

我明白了:

repositories {
    maven.url 'http://example.com/artifactory/libs-release'
    maven.url 'http://example.com/artifactory/libs-snapshot'
}

repositories {
    maven { url 'http://example.com/artifactory/libs-release' }
    maven { url 'http://example.com/artifactory/libs-snapshot' }
}

都工作。

According to documentation MavenArtifactRepository拥有财产url

以下内容 - 对url值的方法调用或属性设置器的调用:

 maven.url 'http://example.com/artifactory/libs-release'

以下是什么(我猜它正在调用MavenArtifactRepository构造函数):

 maven { url 'http://example.com/artifactory/libs-release' }

1 个答案:

答案 0 :(得分:3)

首先,让我们分析url属性访问(在两个示例中):

是方法调用还是属性setter的调用?嗯,它有点两种。让我们引用Mr. Hakis blog

  

Gradle将为实际的类实现创建一个代理类,并添加(以及其他)属性setter方法。该方法具有属性的名称,并且具有与该属性相同类型的单个参数。它与Groovy已添加的setPropertygetProperty方法不同。

这是纯粹的语法糖,它支持Gradle组合配置和脚本编写的感觉。如果您认为它具有误导性,只需使用赋值运算符(由于Groovy,它也将使用setter)。

现在,那个maven部分呢?

它看起来像repositories的属性。但是,如果我们查看其类型RepositoryHandler的定义,我们会发现它是一个创建新MavenArtifactRepository的方法,接受闭包或动作(用于Java用法)以进行配置。

这简单地解释了第二个例子,因为我们传递一个闭包,然后配置url属性。 Groovy允许跳过括号。

第一个例子比较棘手。我们仍然使用相同的方法,但这次我们给出一个空的配置闭包作为参数。该方法仍会返回新的MavenArtifactRepository,我们会访问其url属性。