修改现有的Gradle任务

8

在Gradle中使用apply plugin: 'java'时,它除了定义其他任务外还定义了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任务本身定义了在其执行期间运行多个任务的方式。但我还没有找到如何做到。

2个回答

6

processResources是一个类型为Copy的普通任务(您可以在文档中查看)。因此,您可以像配置其他复制任务一样精确地配置它。这足以过滤文件:

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

apply plugin: 'java'

processResources {
   filter(ReplaceTokens, tokens: ['token.to.replace': 'zombo.com'])
}

这里可以找到一个简单的演示。


1
不错,值得一试。是的,我知道processResources扩展了Copy,只是不确定是否可以配置部分复制规范,在查看https://docs.gradle.org/current/javadoc/org/gradle/api/file/CopySpec.html之后,现在更有意义了。 - Aliaksandr Kazlou
当然,请告诉我我的回答是否有帮助。 - Opal

1

ProcessResources是由java-plugin提供的任务,您不需要添加<<来修改它的行为。只需尝试:

processResources{
  //same Code goes here
}

另一个解决方法是在 processResources 和 initConfig 之间添加依赖关系,如下所示:
processResources{
  dependsOn initConfig
}

这将在处理资源之前执行initConfig。
希望这有所帮助。

dependsOn的作用与其相反,它首先运行initConfig,然后是processResources,因此processResources将覆盖之前复制的任何文件。确保顺序的一种方法是使用mustRunAfter,但在这种情况下,您必须为gradle命令提供两个任务。Opal建议的方式对我来说看起来像是一个自然的解决方案。 - Aliaksandr Kazlou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接