【问题标题】:Gradle configuration "builtBy" a taskGradle 配置“builtBy”任务
【发布时间】:2021-11-02 03:43:37
【问题描述】:

考虑以下构建脚本

configurations {
    myConfig
}
task addToMyConfig {
    doLast {
        println "Doing some work"
        dependencies {
            myConfig 'log4j:log4j:1.2.17'
        }
    }
}
task useMyConfig {
    doLast {
        println "myConfig = $configurations.myConfig.files"
    }
}

问题:有没有办法在每次解决configurations.myConfig 时触发addToMyConfig,而不添加useMyConfig 依赖于addToMyConfig 的任务依赖项?

我想说:

configurations.myConfig.builtBy addToMyConfig

**我不想说**

useMyConfig.dependsOn addToMyConfig 

我想避免useMyConfig.dependsOn addToMyConfig,因为可能有很多任务消耗configurations.myConfig

注意:有一个ConfigurableFileCollection.builtBy(Object... tasks) 方法可以解决我的问题,只要它存在于Configuration 接口上(配置扩展FileCollection

【问题讨论】:

    标签: gradle dependencies directed-acyclic-graphs


    【解决方案1】:

    您真的需要 task 来使用依赖项填充 configuration 吗?

    Configuration#withDependencies 可用于在解析期间添加依赖项。像这样:

    configurations {
      myConfig
    }
    
    configurations.myConfig.withDependencies {deps ->
      println "Resolving dependencies"
      dependencies {
        myConfig "log4j:log4j:1.2.17"
      }
    }
    
    task useMyConfig {
        doLast {
            println "myConfig = $configurations.myConfig.files"
        }
    }
    

    【讨论】:

    • 感谢您的回答。虽然这似乎可以解决问题,但解决依赖关系涉及“工作”。我想利用 Gradle 的输入/输出哈希,以便我可以从 UP-TO_DATE 检查中受益。我想把它分成两个任务,第一个任务做一些“工作”并创建一个 gradle 脚本。第二个“应用” gradle 脚本。
    【解决方案2】:

    不可能开箱即用。一个任务最多运行一次。

    当您调用configurations.myConfig时,您调用的是添加到ConfigurationContainer的动态属性

    使用 groovy,应该可以通过 metaClass 覆盖 configurationContainers 的行为。您将在这里调用一个函数,而不是一个任务。

    【讨论】:

    • “任务最多运行一次”规则绝对没问题。我希望任务在每个构建中只运行一次(假设构建中需要配置解析)。与@eloff 的回答一样,我不想运行一个函数,我想运行一个做一些“工作”的任务,所以我想使用任务提供的输入/输出散列和UP-TO-DATE 功能
    【解决方案3】:

    这就是我想的你想要的:

    def files = project.files(your,produced,files)
    files.builtBy addToMyConfig
    myConfig.dependencies.add(project.dependencies.create(files))
    

    【讨论】:

    • 对不起,我迟到了一年,哈哈……但是你解决了它,它是由个人依赖而不是配置构建的。这是有道理的,因为 deps 是生产单位,而 configs 是消费单位。谢谢!
    • @Lanchon 你试过这个代码吗?我无法让它工作(Gradle 5.4.1)。请求myConfig 时不会执行addToMyConfig 任务。
    • 最后,我发现了一个有趣的事情:配置解析本身并没有考虑到配置依赖。但是如果useMyConfig.dependsOn configurations.myConfig,则对addToMyConfig 的依赖会传播到useMyConfig,并且一切正常。
    • 使用useMyConfig.dependsOn configurations.myConfig,您明确告诉 gradle 在执行任务 useMyConfig 之前解析 myConfig。这是一件不寻常的事情;为什么在您的情况下需要它取决于您如何编写 useMyConfig。并不是暗示某些事情是“错误的”,但可能有一种更惯用的方式来编写任务。如果任务输入以 gradle-traceable 的方式依赖于配置,gradle 将为您创建一个隐式的dependsOn 关系。
    • 然而,这件事与最初关于如何触发配置解析任务的问题无关。 (TL;DR 你不能,AFAIK,但你可以触发依赖解析任务。)如果适用,请标记为已回答,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多