【问题标题】:Migrating from ant to gradle - macrodef alternatives?从 ant 迁移到 gradle - macrodef 替代方案?
【发布时间】:2018-11-22 09:03:46
【问题描述】:

我们正在从 Ant 迁移到 Gradle。在开始时,Gradle 看起来很有希望,当我开始将目标从 Ant 迁移到 Gradle 时,遇到了类似的问题,之前使用 Ant。

Ant 构建流程看起来像 -

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

接下来我们有几个目标可以将构建的 jar 和一些其他资源文件复制到 windows 服务器。它只是一个 windows 服务器而不是 repo 之类的连接。

这些复制目标是基于发布的(内部使用宏定义) - 如果是 alpha,它必须复制到不同的文件夹并为了稳定发布不同的文件夹。

另一个宏定义是在复制新文件之前将服务器中存在的现有文件备份到备份文件夹。


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

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

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

在内部,他们正在做同样的事情,只是将文件从源复制到目标和一些打印语句。但它看起来重复。我在ant中寻找类似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}"
    }
}

}

我在几个地方有类似的 sn-ps。不好看。

有什么方法可以重用 gradle 中的方法/函数?或者我在这里假设错误的事情..或者我试图将 gradle 用于它不适合的事情?如果不在 gradle 中使用自定义任务,那么完成这些复制和备份文件任务的最佳方法是什么?

【问题讨论】:

    标签: java gradle ant


    【解决方案1】:

    这里有几个选项。

    创建一个插件(见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')
    } 
    

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 2013-06-23
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多