从ant + ivy迁移到gradle

时间:2013-06-26 15:12:02

标签: eclipse ant gradle ivy gradle-eclipse

我读了许多关于gradle的好东西,所以我印象深刻。很多人都很热情,用gradle开发是多么容易。他们都强调gradle的多项目能力。

我已经有一个包含一些子项目的主项目。外部依赖项在所有项目自己的ivy.xml中定义。模块的相互依赖性在eclipse的.classpath文件和ant build.xml中并行定义。这样我可以为IDE构建并可以使用ant创建运行时。有没有一种简单的方法可以将相同的构建结构从eclipse / ant和ivy迁移到gradle(或gradle + ivy)?

构建过程很简单:

  1. 从ivy.xml
  2. 解析子项目的依赖项
  3. 构建子项目
  4. (对所有子项目重复1和2)
  5. 解决主项目的依赖关系(来自ivy和eclipse / ant配置)
  6. 构建主项目
  7. 将所有内容打包成一个jar文件
  8. 不是火箭科学......但在蚂蚁中实施它需要很多天。 迁移到gradle是否真的很简单?如果是,那么起点是什么?

    我看到有一个eclipse插件,但我看到只有生成.classpath的可能性,而不是解析/读取它。我也看到了Ivy XML插件。我不清楚如何处理依赖项目/模块?

    欢迎任何帮助。

    问候:     本斯

2 个答案:

答案 0 :(得分:3)

如果你没有很多自定义ant任务,只需要转换你的ivy依赖项,这将从你的ivy.xml创建gradle依赖项。粘贴到ivy.xml旁边的空build.gradle中并运行gradle ivyToGradle。然后将输出复制到build.gradle文件中。由于使用了compileOnly配置,因此需要gradle 2.12+。

这不会处理所有可能的ivy.xml设置,您可能需要调整您对ivy.xml的特定用法。它处理基础知识,如运行时配置,测试配置,仅编译配置,全局排除,传递真​​/假和版本强制。

task ivyToGradle {
    description "Converts dependencies in ivy.xml to gradle dependencies."
    doLast {
        def ivyModule = new XmlParser().parse(new File("$projectDir/ivy.xml"))
        if (!ivyModule.dependencies.exclude.isEmpty() || !ivyModule.dependencies.override.isEmpty()) {
            println "configurations.runtime {"
            ivyModule.dependencies.exclude.each {
                def excludeStrs = []
                if (it.@org != null) {
                    excludeStrs.add("group: '${it.@org}'")
                }
                if (it.@module != null) {
                   excludeStrs.add("module: '${it.@module}'")
                }
                if (!excludeStrs.isEmpty()) {
                    def excl = excludeStrs.join(", ")
                    println "    exclude ${excl}"
                }
            }
            def overrides = ivyModule.dependencies.override.findResults {
                if ("exact" != it.@matcher) {
                    return null
                }
                if (!it.@org || !it.@module || !it.@rev) {
                    return null
                }
                return "        '${it.@org}:${it.@module}:${it.@rev}'"
            }
            if (overrides) {
                println "    resolutionStrategy.force("
                println overrides.join(",\n")
                println "    )"
            }
            println "}"
            println ""
        }
        println("dependencies {")
        ivyModule.dependencies.dependency.each {
            def transitive = ("false" != it.@transitive)
            def force = ("true" == it.@force)
            def scope = "compileOnly" // Requires gradle 2.12 or later
            if (it.@conf?.contains("test")) {
                scope = "testCompile"
            } else if (it.@conf?.contains("runtime")) {
                scope = "compile"
            }
            def hasBlock = !it.exclude.isEmpty() || !transitive || force
            if (hasBlock) {
                println "    $scope('${it.@org}:${it.@name}:${it.@rev}') {"
                it.exclude.each {
                    def excludeStrs = []
                    if (it.@org != null) {
                        excludeStrs.add("group: '${it.@org}'")
                    }
                    if (it.@module != null) {
                       excludeStrs.add("module: '${it.@module}'")
                    }
                    if (!excludeStrs.isEmpty()) {
                        def excl = excludeStrs.join(", ")
                        println "        exclude ${excl}"
                    }
                }
                if (!transitive) {
                    println "        transitive = false"
                }
                if (force) {
                    println "        force = true"
                }
                println "    }"
            } else {
                println "    $scope '${it.@org}:${it.@name}:${it.@rev}'"
            }
        }
        println("}")
        println ""
    }
}

答案 1 :(得分:1)

您必须手动迁移构建,将build.xmlivy.xml转换为Gradle的构建语言。 (有一个Ant导入功能,但在实践中它并不是特别有用。)必要时,您可以轻松地重用Ant任务。您可以使用Eclipse Gradle插件将Gradle构建导入Eclipse,或使用Gradle Eclipse插件生成Eclipse文件。一个好的开始是研究Gradle User Guide的前几章,然后是关于Ant集成和多项目构建的章节。完整的Gradle分发版附带了许多样本构建。