从蚂蚁迁移到gradle-macrodef替代品?

时间:2018-11-22 09:03:47

标签: java gradle ant

我们正在从Ant迁移到Gradle。起初,当我开始将目标从Ant迁移到Gradle时,Gradle看起来很有前途,遇到类似的问题,早先在Ant上就遇到过。

Ant构建流程如下-

我们有一个Java应用程序-用于清理,编译和构建项目jar的Ant。

接下来,我们没有几个目标可以将生成的jar和其他一些资源文件复制到Windows服务器。它只是Windows服务器,而不是像repo这样的关系。

这些复制目标基于发行版本(内部使用macrodef)-如果是alpha版本,则必须复制到其他文件夹,并且要稳定发行不同的文件夹。

另一个macrodef是将服务器中存在的现有文件备份到备份文件夹,然后再在其中复制新文件。


迁移到Gradle- 我喜欢Gradle执行清理,编译和构建任务的方式。我为此使用Java插件。

在将文件复制到Windows服务器并在复制新文件之前备份旧文件的下一个任务中,我遇到了问题。

在Gradle中,我创建了一些自定义任务,例如copyJarAlpha,copyJarStable,backupJarAlpha,backupJarStable等。

在内部,他们只是在将文件从源复制到目标以及一些打印语句而执行相同的操作。但它看起来是重复的。我正在寻找类似macrodef的方法。

task deployAlpha {

doFirst {
    isJenkinsAvailable(deployDirAlpha)
}

doFirst {
    if(isDeployLibsTaskRequired(outputDir,deployDirAlpha)) {
        tasks.findByName('deployLibsAlpha').execute()
    }
}

doLast {
    println "Deploying corejar jar to : ${deployDirAlpha}"
    copy {
        from "${outputDir}/${corejar}"
        into "${deployDirAlpha}"
    }
    println "Deploying evan-core jar to : ${deployDirAlpha}/lib"
    copy {
        from "${externalLibsDir}/core2.jar"
        into "${deployDirAlpha}/lib"
    }
    println "Deploying test resource files to : ${deployDirAlpha}"
    copy {
        from "./test-resources/logback-test.xml", "./test-resources/JUnit-TestSuiteResults.xsl"
        into "${deployDirAlpha}"
    }
}

}

我在几个地方也有类似的摘要。看起来不太好。

有什么方法可以重用gradle中的方法/函数?还是我在这里承担错误的事情。或者我正试图将gradle用于其不想要的事情?如果不在gradle中使用自定义任务,那么完成这些复制和备份文件任务的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

这里有两个选择。

创建插件(请参见writing custom plugins

public class MyPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.with {
            apply plugin: 'x' 
            dependencies {...}
            task deployAlpha{...}
        }
     }
} 

用法

apply plugin: MyPlugin 

script plugin

apply from: 'path/to/script.gradle'

您还可以通过域对象的ext将函数附加到域对象(请参阅ExtraPropertiesExtension

allprojects {
    ext.doProjectStuff = { String arg -> return "project${arg}"}
    dependencies.ext.doSependenciesStuff = { String arg -> return "dependencies${arg}"}
}

用法

def foo = doProjectStuff('x')
dependencies {
    def bar = doDependenciesStuff('y')
}