我有一个复杂的gradle脚本,它围绕构建和部署许多netbeans项目到很多环境包含大量功能。
该脚本运行良好,但实质上它是通过六个包含项目和环境信息的地图配置的。
我想将任务抽象到另一个文件中,这样我就可以在一个简单的构建文件中定义我的地图,并从另一个文件中导入任务。通过这种方式,我可以为许多项目使用相同的核心任务,并使用一组简单的地图配置这些项目。
有人能告诉我如何将一个gradle文件导入到另一个gradle文件中,与Ant的任务类似吗?到目前为止,我已经拖网Gradle的文档无济于事。
其他信息
汤姆在下面的回复之后,我想我会试着澄清我的意思。
基本上我有一个gradle脚本,它运行许多子项目。但是,子项目都是Netbeans项目,并且有自己的ant构建脚本,所以我有gradle任务来调用这些项目。
我的问题是我在文件顶部有一些配置,例如:
projects = [
[name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
[name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]
然后我生成如下任务:
projects.each({
task "checkout_$it.shortname" << {
// Code to for example check module out from cvs using config from 'it'.
}
})
我有很多这类任务生成片段,而且所有这些片段都是通用的 - 它们完全取决于项目列表中的配置。
所以我想要的是将它放在一个单独的脚本中并以下列方式导入它:
projects = [
[name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
[name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]
import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.
因此,在此示例中,tasks.gradle将包含所有通用任务生成代码,并将针对主build.gradle文件中定义的项目运行。通过这种方式,tasks.gradle是一个文件,可供所有大型项目使用,这些项目包含许多带有Netbeans ant构建文件的子项目。
答案 0 :(得分:113)
0.9中有一项新功能。您可以使用apply from: 'other.gradle'
命令。
在Is there a way to split/factor out common parts of Gradle build
上阅读有关同一事项的问题答案 1 :(得分:13)
问题的答案最终出现在插件系统中,您可以在一组插件中添加所需的功能,这些插件可以是位于目录buildSrc/src/main/groovy
中的常规文件。插件也可以捆绑为Jar,虽然我还没试过。
详细信息:Custom Plugins
答案 2 :(得分:4)
嗯,如果没有真正看到你的构建文件,很难说出最适合你的东西。
我可以假设将多个项目构建的环境设置为应该为您提供所需的抽象。
在项目根目录build.gradle
中,您可以定义所有特定于域的内容以及适用于所有子项目的内容:
repositories {
add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
name = 'destRepo'
addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
descriptor = 'optional'
checkmodified = true
}
...
}
...
subprojects {
sourceCompatibility = 1.5
targetCompatibility = 1.5
group = 'my.group'
version = '1.0'
uploadArchives {
uploadDescriptor = true
repositories {
add rootProject.repositories.destRepo
}
}
apply{ type my.group.gradle.api.plugins.MyPlugin }
...
}
dependsOnChildren()
项目根目录可能还包含一个gradle.properties
文件,您可以在其中定义项目使用的属性:
buildDirName=staging
repo.dest.dir=/var/repo
...
然后在名为settings.gradle
的项目根目录中的另一个文件中,您实际指向子项目:
include 'my-first-component',
'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...
每个子项目目录都包含一个build.gradle
文件,其中仅包含子项目特定内容。
无论您是从项目根目录还是子项目目录调用gradle
,gradle都会自动考虑在各种文件中完成的所有定义。
另请注意,只要您没有在根级别的默认插件之外加载任何插件,就不会为您的项目root执行编译任务。