【问题标题】:Modify an existing gradle task修改现有的 gradle 任务
【发布时间】:2015-10-01 23:48:21
【问题描述】:

apply plugin: 'java' 在 Gradle 中时,它在其他任务中定义 processResources。 我想在processResources 期间替换其中一个资源文件中的令牌/参数。 我在build.gradle 中定义了以下复制任务:

import org.apache.tools.ant.filters.ReplaceTokens                                                                                                                                                                                         

task initConfig(type: Copy) {                                                                                                                                                                                                             
    from("src/resources/assets/js") {                                                                                                                                                                                                     
        include 'config.js'                                                                                                                                                                                                               
        filter(ReplaceTokens, tokens: [host: "${System.env.HOST ?: 'localhost:58080'}" as String])                                                                                                                                        
    }                                                                                                                                                                                                                                     
    into "$sourceSets.main.output.resourcesDir/assets/js"                                                                                                                                                                                 
}   

如果我运行gradle -q run initConfig,它会正常工作。 我想要的是这个任务作为processResources 任务的一部分运行,我试图把相同的逻辑放在下面:

processResources << {
    // same code goes here
}

processResources {
    doLast {
        // same code goes here
    }
}

它们都不起作用。因此,如果运行 gradle -q clean processResources 资源被复制,但令牌没有被替换。

我不想在运行构建时强制显式运行/添加initConfig,所以理想情况下gradle -q build 应该做所有必要的事情。

我相信这是可能的,因为build 任务本身定义了在其执行期间运行多个任务的方式。还没找到怎么做。

【问题讨论】:

    标签: java gradle build.gradle


    【解决方案1】:

    processResources 是(您可以在docs 中查看)类型为Copy 的普通任务。因此,您可以按照与配置其他复制任务完全相同的方式对其进行配置。这足以过滤文件:

    import org.apache.tools.ant.filters.ReplaceTokens 
    
    apply plugin: 'java'
    
    processResources {
       filter(ReplaceTokens, tokens: ['token.to.replace': 'zombo.com'])
    }
    

    Here你可以找到一个简单的demo。

    【讨论】:

    • 不错,可以尝试一下。是的,我知道 processResources 扩展了 Copy,只是不确定您是否可以配置部分复制规范,在查看 docs.gradle.org/current/javadoc/org/gradle/api/file/… 之后,现在更有意义了。
    • 当然。如果我的回答有帮助,请告诉我。
    【解决方案2】:

    ProcessResources 是 java-plugin 提供的一个任务,你不需要添加

    processResources{
      //same Code goes here
    }
    

    另一种解决方法是在 processResources 和 initConfig 之间添加依赖项,如下所示:

    processResources{
      dependsOn initConfig
    }
    

    这将在 processResources 之前执行 initConfig。

    希望对您有所帮助。

    【讨论】:

    • dependsOn 恰恰相反,它首先运行 initConfig,然后运行 ​​processResources,因此 processResources 将覆盖之前复制的任何文件。确保顺序的一种方法是使用 mustRunAfter,但在这种情况下,您必须为 gradle 命令提供这两个任务。 Opal 建议的方式对我来说似乎是一种自然的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2019-08-09
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多