我读过很多关于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-config)
- 构建主项目
- 将所有内容打包到一个jar文件中
不是火箭科学。。。但是在ant中实现它花了很多天的时间。把它移植到gradle真的很简单吗?如果是,起点是什么?
我看到有一个eclipse插件,但我只看到生成.classpath的可能性,而不是解析/读取它。我也看到了一个Ivy XML插件。我不清楚如何处理依赖项目/模块?
欢迎任何帮助。
谨致问候:Bence
如果你没有很多自定义ant任务,只需要转换你的ivy依赖项,这将从你的ivy.xml创建gradle依赖项。粘贴到ivy.xml旁边的一个空build.gradle中,然后运行gradle ivyToGradle
。然后将输出复制到build.gradle文件中。由于使用了compileOnly配置,需要2.12+级。
这不会处理所有可能的ivy.xml设置,您可能需要根据您对ivy.xml的特定使用进行调整。它处理基本配置,如运行时配置、测试配置、仅编译配置、全局排除、可传递的true/false和版本强制。
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.xml
和ivy.xml
转换为Gradle的构建语言。(有一个Ant导入功能,但在实践中并不是特别有用。)在必要的地方,您可以轻松地重用Ant任务。您可以使用EclipseGradle插件将Gradle构建导入Eclipse,或者使用GradleEclipse插件生成Eclipse文件。一个好的开始是学习Gradle用户指南的前几章,然后是关于Ant集成和多项目构建的章节。完整的Gradle分销船上有许多样本构建。