我怎样才能将一个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都会自动考虑在各个文件中完成的所有定义。
还要注意,只要你没有加载超过默认插件的插件,就不会为你的项目根目录执行编译任务。