gradle脚本,什么’;s直接dsl与由自定义函数调用的“;申请地点:”;

gradle脚本,什么’;s直接dsl与由自定义函数调用的“;申请地点:”;,gradle,apply,Gradle,Apply,首先,私有maven repo中部署了一些常见脚本: 在目标项目中,build.gradle subprojects { apply from: 'http://domain/repo/com/d/build/script/java-project/1.0/java-project-1.0.gradle' apply from: 'http://domain/repo/com/d/build/script/maven/1.0/maven-1.0.gradle' } 没关系 但是,

首先,私有maven repo中部署了一些常见脚本:

在目标项目中,build.gradle

subprojects {
  apply from: 'http://domain/repo/com/d/build/script/java-project/1.0/java-project-1.0.gradle'
  apply from: 'http://domain/repo/com/d/build/script/maven/1.0/maven-1.0.gradle'
}
没关系

但是,

它将失败,并显示以下消息:

错误:无法添加任务“:javadocJar”,因为具有该名称的任务已存在

任务“:javadocJar”在脚本“java-project-1.0.gradle”中定义 我们有几个子项目

为什么?

顺便说一句:任何人都可以给我一个“申请来源:”的来源位置线索


很难自己定位它。

问题是在latte的情况下,您将脚本多次应用于同一根项目。

这怎么可能?这很有趣,也有点棘手:

  • 您正在将
    applyScript
    定义为当前Gradle项目的扩展容器
    ext
    上的闭包
  • 通常,
    apply from:…
    org.gradle.api.plugins.PluginAware
    接口上作为方法调用
    apply(Map)
    处理,该接口是
    org.gradle.api.Project
    接口的超级接口之一
    • 这意味着每次编写
      apply…
      时,您都在对当前Gradle项目调用
      apply
      方法(其中指定了
      apply…
  • 当您将
    apply…
    定义为闭包的一部分时,将应用标准委托
    • 它在语义上与
      this.apply…
    • 默认情况下,此
      指向作为根项目的封闭类/对象(此处不能是任何其他对象)
  • 因此,即使看起来您正在将这两个脚本应用于所有子项目,实际上您正在将这两个脚本应用于根项目N次(N是子项目的数量)。

    您需要做的是将委托更改为正确的
    项目
    实例。

  • 通过向闭包添加一个附加参数并显式调用该参数的apply方法,可以非常轻松地完成此操作:

    ext.applyScript = { project, script, version ->
        project.apply from: "..."
    }
    
    subprojects {
        applyScript(it, 'java-project', '1.0')
        applyScript(it, 'maven', '1.0')
    }
    
  • 也可以显式设置委托:

    ext.applyScript = { script, version ->
        apply from: "..."
    }
    
    subprojects {
        applyScript.resolveStrategy = Closure.DELEGATE_FIRST
        applyScript.delegate = it
    
        applyScript('java-project', '1.0')
        applyScript('maven', '1.0')
    }
    
  • ext.applyScript = { script, version ->
        apply from: "..."
    }
    
    subprojects {
        applyScript.resolveStrategy = Closure.DELEGATE_FIRST
        applyScript.delegate = it
    
        applyScript('java-project', '1.0')
        applyScript('maven', '1.0')
    }