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


97

我有一个复杂的gradle脚本,该脚本封装了围绕将多个netbeans项目构建和部署到许多环境的功能。

该脚本可以很好地运行,但是从本质上来说,它是通过六个包含项目和环境信息的地图进行配置的。

我想将任务抽象到另一个文件中,以便可以在一个简单的构建文件中简单地定义地图,然后从另一个文件中导入任务。这样,我可以对多个项目使用相同的核心任务,并使用一组简单的地图来配置这些项目。

谁能告诉我如何以与Ant的任务类似的方式将一个gradle文件导入另一个文件?到目前为止,我已经拖了Gradle的文档无济于事。

附加信息

汤姆在下面做出回应后,我想我会尽力弄清楚我的意思。

基本上,我有一个gradle脚本,它可以运行许多子项目。但是,这些子项目都是Netbeans项目,并且带有它们自己的ant生成脚本,因此我要分担一些任务来分别调用它们。

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

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构建文件的子项目的大型项目都可以使用task.gradle。


3
考虑“ apply from:'other.gradle'”构造以导入外部声明。(请参阅gradle.org/0.9-preview-1/docs/userguide/…此处的“ 12.4。使用外部构建脚本配置项目” )
Petr Gladkikh 2010年

@PetrGladkikh apply from立即执行外部任务。这在执行逻辑中可能不是最好的选择(即,我想在需要时执行任务,而不是立即执行)。
IgorGanapolsky '16

上面的注释中的该语句不正确apply from立即执行外部任务。不要误导。外部任务已配置,未执行。
Jarekczek

Answers:




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

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


1
感谢您抽出宝贵的时间回答。这不是我遇到麻烦的子项目,而是创建常见任务的“库”。我已经用更多信息和代码片段编辑了原始问题,以使事情更加清楚。
安东尼·罗伊,2010年

1
因此,不是从示例中执行import(“ tasks.gradle”),而是让子项目{}部分指定所有子项目使用的通用任务生成代码。这应该提供您正在寻找的相同抽象!
汤姆(Tom)2010年

常春藤插件真的有必要吗?不能单独使用Gradle吗?
IgorGanapolsky '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.