从 ant + ivy 迁移到 gradle
Posted
技术标签:
【中文标题】从 ant + ivy 迁移到 gradle【英文标题】:Migrating from ant + ivy to gradle 【发布时间】:2013-06-23 19:41:32 【问题描述】:我读了很多关于 gradle 的好东西,所以给我留下了深刻的印象。许多人热衷于使用 gradle 开发是多么容易。都强调 gradle 的多项目能力。
我已经有一个包含一些子项目的主项目。外部依赖项在所有项目自己的 ivy.xml 中定义。并且在 Eclipse 的 .classpath 文件和 ant build.xml 中同时定义了模块相互依赖关系。这样我就可以为 IDE 构建并且可以使用 ant 创建运行时。有没有一种简单的方法可以将相同的构建结构从 eclipse/ant 和 ivy 迁移到 gradle(或 gradle + ivy)?
构建过程很简单:
-
从 ivy.xml 解决子项目的依赖关系
构建子项目
(对所有子项目重复 1 和 2)
解决主项目的依赖关系(来自 ivy 和 eclipse/ant 配置)
构建主项目
将所有内容打包到一个 jar 文件中
不是火箭科学……但在 ant 中实现它需要很多天。 将其迁移到 gradle 真的很简单吗?如果有,出发点是什么?
我看到有一个 Eclipse 插件,但我只看到生成 .classpath 的可能性,而不是解析/读取它。我也看到了一个Ivy XML 插件。我不清楚如何处理依赖的项目/模块?
欢迎任何帮助。
问候: 本斯
【问题讨论】:
【参考方案1】:如果您没有很多自定义的 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 ""
【讨论】:
如何运行这个?我无法动态生成 build.gradle 和 setting.gradle 文件。谁能帮我吗 ?谢谢。 嗨@TanmaySahoo,安装gradle 后,在您的ivy.xml 目录中,将该脚本保存到名为build.gradle
的文件中,然后运行gradle ivyToGradle
。然后将build.gradle
的内容替换为脚本的输出。【参考方案2】:
您必须手动迁移构建,将 build.xml
和 ivy.xml
翻译成 Gradle 的构建语言。 (有一个 Ant 导入功能,但在实践中并不是特别有用。)您可以在必要时轻松地重用 Ant 任务。您可以使用 Eclipse Gradle 插件将 Gradle 构建导入 Eclipse,或使用 Gradle Eclipse 插件生成 Eclipse 文件。一个好的开始是学习Gradle User Guide 的前几章,然后是关于 Ant 集成和多项目构建的章节。完整的 Gradle 发行版附带许多示例构建。
【讨论】:
这对我来说听起来不太容易。重新实现相同的逻辑......是否有必要用 gradle 生成的覆盖我的工作 eclipse 设置:相反的方式更适合我。那么使用 IvyXML 插件呢?为什么我也要扔掉我的常春藤设置?这简单明了的点在哪里?摇篮本身?这么方便,值得付出努力吗? 作为一个起点,这对我来说似乎更有希望:touk.pl/blog/en/2012/11/26/…以上是关于从 ant + ivy 迁移到 gradle的主要内容,如果未能解决你的问题,请参考以下文章
PHP 中持续集成的构建工具(Ant、Ivy、Maven、Phing?)
Apache Ant + Ivy 构建了一个部署到本地 Tomcat 的 Web 应用程序