当前位置: 首页 > 知识库问答 >
问题:

在Gradle Kotlin DSL中注册和创建有什么区别

穆轶
2023-03-14

Gradle(5.0)中有两种创建方法,即任务:

tasks {
    val javadocJar by creating(Jar::class) {
        val javadoc by tasks

        from(javadoc)
        classifier = "javadoc"
    }
}

tasks {
    val javadocJar by registering(Jar::class) {
        val javadoc by tasks

        from(javadoc)
        classifier = "javadoc"
    }
}

基本一样的API,那么有什么区别呢?

共有2个答案

曾洲
2023-03-14

公认的答案很好,但我想补充一点,如果您想实际使用由创建的/稍后注册调用创建的引用,那幺API将有所不同。比较

create<MavenPublication>("main") {
    …

    val sourcesJar by tasks.creating(Jar::class) {
        val sourceSets: SourceSetContainer by project
        from(sourceSets["main"].allJava)
        classifier = "sources"
    }

    artifact(sourcesJar)
}

create<MavenPublication>("main") {
    …

    val sourcesJar by tasks.registering(Jar::class) {
        val sourceSets: SourceSetContainer by project
        from(sourceSets["main"].allJava)
        classifier = "sources"
    }

    artifact(sourcesJar.get())
}

在注册的情况下,因为它是惰性的,您需要一个额外的. get()调用,否则您会得到一个异常:

* What went wrong:
Cannot convert the provided notation to an object of type MavenArtifact: task ':experiments:sourcesJar'.
The following types/formats are supported:
  - Instances of MavenArtifact.
  - Instances of AbstractArchiveTask, for example jar.
  - Instances of PublishArtifact
  - Maps containing a 'source' entry, for example [source: '/path/to/file', extension: 'zip'].
  - Anything that can be converted to a file, as per Project.file()
席乐童
2023-03-14

请参阅https://docs . grad le . org/current/user guide/kot Lin _ DSL . html # using _ the _ container _ API:

tasks.named("check")                  
tasks.register("myTask1")

上面的示例依赖于配置避免API。如果您需要或希望急切地配置或注册容器元素,只需将named()替换为getByName(),将register()替换为create()。

创建注册(或5.0之前的Gradle版本中的create和register)之间的差异与“任务配置避免”新API有关,这里详细介绍了这一点(参见本节):

如何推迟任务创建?

此功能要求构建作者通过将任务创建从TaskContainer.create(java.lang.String)API迁移到TaskContaineer.register(java.lang.String)APIs来选择加入。寄存器(…​) 当且仅当需要任务时,API注册将在以后创建的任务。创建(…​) API在被调用时继续急切地创建和配置任务。

 类似资料:
  • 问题内容: 对于一个宠物项目,数据库进入了顶峰, 元数据 达到了顶峰,我很难理解该命令与MySQL命令之间的区别(如果有)。 有什么区别吗?如果不是这样,这是关系数据库行为的一种相当典型的模式(我听说过,对于其他数据库(例如Oracle),模式存在于数据库中,而不是与数据库处于同一级别)。 谢谢! 问题答案: MySQL的文档说: CREATE DATABASE创建具有给定名称的数据库。要使用此语

  • 问题内容: 我正在使用React.js创建一个地牢爬虫游戏,并且正在使用Array.fill(0)来初始化棋盘。但是当我在2d数组内设置元素时,它将整个Array(列)设置为,而不是单个元素。我有另一个功能,注释掉,可以正常工作。那么,为什么会发生这种情况?如何正确使用Array.fill? 这是我的董事会组件: 问题答案: 您可以通过Array.fill的方式填充2D数组:

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。

  • 只需在Xpath中添加即可--它突出显示--各种页面元素----它表示什么? 下面是用于Gmail密码字段的XPaths。的意义是什么? >

  • 问题内容: 我是node.js的新手,并希望为用户创建一个注册和登录页面。还需要对该用户进行适当的授权。我想将用户信息存储在mongodb数据库中。我该如何实现?有人可以提供我吗?这样做的代码,以便我可以开始使用node.js和mongodb。请帮助 问题答案: 您可以在Alex Young 的Nodepad应用程序中找到要执行的操作的完整示例。您应该查看的2个重要文件是这些2: https :