如何在Gradle中应用补丁文件?

Tom*_*han 4 patch gradle

我有一个Gradle构建脚本,可以成功构建我的项目并编译我需要的所有工件。

但是,在某些情况下,我想让其他开发人员可以选择修补某些文件。例如,在其中一个档案中,有一个xml文件,其中包含有关数据库挂钩的信息-一些开发人员使用其他版本(甚至引擎),并且在使用生成输出之前需要对其进行更改。

我不想让他们更改可能会错误提交的版本控制文件,而是让他们选择拥有构建脚本适用的本地单个补丁文件。

在旧的蚂蚁脚本中,我们做了这样的事情

<target name="appcontext-patch" if="applicationContext.patch.file">
    <patch patchfile="${applicationContext.patch.file}" originalfile="${dist.dir}/applicationContext.xml"/>
</target>
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何在Gradle中做到这一点。是否有比尝试直接将其转换为to更好的(即更惯用的)方法ant.patch

一些上下文
这是文件首先如何在存档中结束的方式:

into('META-INF') {
    from 'deployment', {
        include 'applicationContext.xml'
        rename { fn ->  "jboss-spring.xml" }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是fantabulous如果我可以做这样的事情

into('META-INF') {
    from 'deployment', {
        include 'applicationContext.xml'
        rename { fn -> "jboss-spring.xml' }
        patch 'local/applicationContext.xml.patch'
    }
}
Run Code Online (Sandbox Code Playgroud)

并在将文件放入存档之前应用补丁文件。我不介意编写一些代码来实现这一目标,但是我对Gradle还是很陌生,我也不知道从哪里开始。

Jos*_*non 5

您应该能够将您的蚂蚁电话直接转换为gradle。

关于如何执行此操作的gradle文档。基本上,属性成为命名参数,子标记成为闭包。该文档有很多很好的例子。

一旦完成翻译后的蚂蚁任务,就可以在适当的任务中放入doFirst或doLast块。

我的第一个猜测是这样的:

apply plugin: 'java'

assemble.doFirst {
    ant.patch(patchfile: applicationContext.patch.file,
              originalFile: "${dist.dir}/applicationContext.xml")
}
Run Code Online (Sandbox Code Playgroud)

这未经测试,所以我敢肯定,它将使您从正确的道路入手。目的是在java插件组装档案文件之前,您要gradle调用闭包。在这种情况下,闭包将执行对XML进行修补的ant操作。

或者,您可以使用上面执行的任务,在该任务上执行复制和标记。

task myCopyTask(type: Copy) {
    ...
} << {
    ant.patch(patchfile: applicationContext.patch.file,
              originalFile: "${dist.dir}/applicationContext.xml")
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以自己编写任务,而左移运算符(<<)则相当.doLast酷。我不确定您喜欢哪种方法,但是如果您已经有一个复制任务首先将文件放在那儿,我认为doLast会使相关的代码块尽可能地靠近彼此。