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

Gradle:Task不会根据它使用的配置执行另一个任务

凌轶
2023-03-14

module1,它生成一个公共API jar并通过“publicAPI”配置公开它:

configurations {
    publicAPI
}

task generatePublicAPI(type: Jar) {
    outputs.upToDateWhen { false }
    baseName 'public-api'
    from sourceSets.main.output
}

artifacts {
    publicAPI generatePublicAPI
}

module2,它使用公共API jar(通过引用module1中定义的“公共API”配置)来生成应用程序jar:

configurations {
    generateApplication
}

dependencies {
    generateApplication project(path: ':module1', configuration: 'publicAPI')
}

task jarApp(type: Jar) {
    baseName 'app'
    from configurations.generateApplication.collect {
        it.isDirectory() ? it : zipTree(it)
    }
}

现在,当我执行'gradle:module2:jarapp'任务时,我得到了以下错误:

task jarApp(dependsOn: 'module1:generatePublicAPI', type: Jar) {...}

但是,这种方法是否违背了使用依赖配置的目的之一,这样我就不必担心如何构建module1的细节,例如哪个任务生成jar以及它生成的工件是什么?

我认为gradle能够通过遵循引用的依赖配置的“路线”来完成它需要执行的任务。

我是不是缺少了一些东西,这样“GeneratePublicAPI”任务就可以自动执行,而不必为“CreateApp”任务显式声明“Dependson”?

共有1个答案

韩鸿
2023-03-14

我在GradleWare的论坛上问了同样的问题,并从一个核心开发人员那里得到了答案,下面是链接。

基本上,问题在于collect方法返回一个新集合,但gradle无法知道这个新集合是从配置中生成的,因此无法推断要执行哪个任务。

解决方案不是声明任务的依赖项,而是声明实际配置的依赖项,如下所示:

task jarApp(dependsOn: configurations.generateApplication, type: Jar)
 类似资料:
  • 我正在从事一个spring boot项目,以自动化与gradle的集成测试。我最近开始在一家新企业工作,我的同事们按如下方式运行集成测试:在构建中。gradle文件有一个集成测试任务 启动任务后,应用程序开始在指定端口运行,然后打开postman,导入集合并运行测试。 我的工作是找到一种方法来跳过额外的点击,即自动运行邮递员集合。第一个想法是使用postman-run gradle插件,但由于企业

  • 本文向大家介绍根据另一列中的DATE值执行MySQL UPDATE,包括了根据另一列中的DATE值执行MySQL UPDATE的使用技巧和注意事项,需要的朋友参考一下 让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 现在让我们基于特定的DATE值(即2019-04-01此处)更新表- 让我们再次检查表记录- 这将产生以下输出-

  • 问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并

  • 我有一个Gradle任务,简单地将文件从一个文件夹复制到另一个文件夹。 当在配置阶段调用copy'from''into'方法时,它可以工作,但当在执行阶段调用它们时,它就不工作了。 这样做是有效的 gradle copyServerConfig 如果我把它放在doFirst{}块中,也会发生同样的事情。 我不明白的另一件事是: gradle task1 但如果我改成这样: gradle task1

  • Intellij IDEA用不良行为把我逼疯了: 我有一个(基于Gradle的)项目,有两个用Java编写的主要类,每个类都在自己的包中。 一个叫"HelloFX" 一个叫"ImageView示例" 两者都使用JavaFX,因此需要一些特殊的“运行配置”。 为了“HelloFX” 对于“ImageViewExample” 配置是相同的,在这两种情况下(这将是很好的,不必处理一个巴洛克式复杂的文本框

  • 我在gradle项目中添加了一个任务: 现在,任务总是在任务之前运行。这很好,因为构建任务包含许多步骤。现在我想显式禁用其中一个包含的任务。