我怎样才能将一个Gradle脚本导入到另一个?

我有一个复杂的gradle脚本,它在构build和部署一些netbeans项目到许多环境中都包含了大量的function。

这个脚本运行得非常好,但实质上它是通过六个地图来configuration的,这些地图包含项目和环境信息。

我想将任务抽象到另一个文件中,以便我可以简单地在一个简单的构build文件中定义我的地图,并从另一个文件中导入任务。 通过这种方式,我可以为许多项目使用相同的核心任务,并使用一组简单的地图来configuration这些项目。

任何人都可以告诉我如何可以导入一个gradle文件到另一个,以类似的方式ant的任务? 到目前为止,我已经对Gradle的文档进行了无情的扫描。

附加信息

在汤姆的回答下面,我想我会试图澄清我的意思。

基本上我有一个运行一些子项目的Gradle脚本。 然而,子项目都是Netbeans项目,并带有自己的ant build脚本,所以我有gradle中的任务来调用这些脚本。

我的问题是,我有一些configuration在文件的顶部,如:

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'. } }) 

我有许多这样的任务生成片段,它们都是通用的 – 它们完全依赖于项目列表中的configuration。

所以我想要的是把它放在一个单独的脚本中,并以下面的方式导入它:

 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构build文件的子项目组成。

0.9中有一个新特性。 你可以使用apply from: 'other.gradle'命令来申请。

阅读我的问题关于同样的事情: 是否有一种方法来分解/分解公共部分的Gradle构build

问题的答案certificate是在Plugins系统中,您可以在一组插件中添加所需的function,这些插件可以是位于buildSrc/src/main/groovy目录下的groovy文件。 插件也可以捆绑成一个jar子,虽然我还没有尝试过。

详情在这里: 自定义插件

那么,在没有真正看到你的构build文件的情况下,很难说出最好的服务。

我可以假设,作为多项目构build应该为您提供您正在寻找的抽象。

在您的项目根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 ,gradle都会自动考虑在各个文件中完成的所有定义。

还要注意,只要你没有加载超过默认插件的插件,就不会为你的项目根目录执行编译任务。