如何将一个Gradle脚本导入另一个?

Ant*_*Roy 91 java ant groovy build gradle

我有一个复杂的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"]
]
Run Code Online (Sandbox Code Playgroud)

然后我生成如下任务:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})
Run Code Online (Sandbox Code Playgroud)

我有很多这样的任务生成片段,并且它们都是通用的 - 它们完全依赖于项目列表中的配置.

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

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.
Run Code Online (Sandbox Code Playgroud)

因此,在此示例中,tasks.gradle将包含所有通用任务生成代码,并将为主build.gradle文件中定义的项目运行.通过这种方式,tasks.gradle是一个文件,可供所有大型项目使用,这些项目包含许多带有Netbeans ant构建文件的子项目.

And*_*ich 122

0.9中有一个新功能.你可以使用apply from: 'other.gradle'命令.

请阅读有关同一事项的问题:是否有办法拆分/分解Gradle构建的常见部分

  • apply from 不允许我在包含的文件中包含插件 {} (2认同)

Ant*_*Roy 14

这个问题的答案最终出现在Plugins系统中,您可以在一组插件中添加所需的功能,这些插件可以是位于目录中的groovy文件buildSrc/src/main/groovy.插件也可以捆绑为Jar,虽然我还没试过.

详细信息:自定义插件


Tom*_*Tom 5

好吧,如果不实际查看构建文件,很难判断什么最适合您。

我可以假设将您的环境设置为多项目构建应该可以为您提供您正在寻找的抽象。

在项目根目录中, 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()
Run Code Online (Sandbox Code Playgroud)

项目根目录还可能包含一个gradle.properties文件,您可以在其中定义项目使用的属性:

buildDirName=staging
repo.dest.dir=/var/repo
...
Run Code Online (Sandbox Code Playgroud)

然后,在项目根目录中名为“ settings.gradleyou”的附加文件中,实际指向子项目:

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')
...
Run Code Online (Sandbox Code Playgroud)

每个子项目目录都包含一个build.gradle仅包含子项目特定内容的文件。

无论您是gradle从项目根目录还是子项目目录调用,gradle 都会自动考虑您在各个文件中完成的所有定义。

另请注意,只要您不加载根级别默认插件之外的任何插件,就不会为您的项目根执行任何编译任务。