有没有一种方法可以分离/因式化Gradle构建中的常见部分?

74

我们有几个独立的构建(每个独立的构建是一个多项目构建)。由于我们有一组被子项目重用的常见任务,主构建脚本已经变得相当庞大。同时,在独立构建之间也存在很多重复。我们正在寻找以下解决方案:

  1. 将主构建文件拆分为较小的文件。
  2. 在其他独立构建中重用构建的某些部分。

在Gradle中实现这一点的最佳方法是什么?

2个回答

88

Gradle 0.9允许你从另一个构建脚本中导入一个构建脚本。请参考: 使用外部构建脚本配置项目。基本上就是apply from: 'other.gradle'

用户指南没有提到的一件事是,'from'参数可以是一个URL,因此你可以将你的共享脚本通过HTTP在某个地方(例如你的子版本库)提供,并从多个构建中导入它们。


5
应用自:'other.gradle' - Guillaume Massé
1
我导入了一个包含一些常用函数的文件,但是我无法调用这些函数。 - Gavriel
我发现这是一个非常好的解决方案 http://saulmm.github.io/squeezing-gradle-builds/ - box
1
@GreenGiant 谢谢您的关注 - 这应该可以工作 http://saulmm.github.io/squeezing-gradle-builds - box
1
apply from 不允许我在包含的文件中使用插件 {}。 - Gavriel
显示剩余10条评论

42

我发现的解决方案意味着将您在other.gradle文件中拥有的内容进行映射。

def getVersionName = { testParam ->
    println "${testParam}"

    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}
ext{
    VERConsts = [:]
    VERConsts['NAME'] = getVersionName("test param")
    VERConsts['NAME_CALL'] = getVersionName
}

然后,在你的build.gradle文件中:

apply from: 'other.gradle'
// ...
android {
    defaultConfig {
        versionName VERConsts['NAME_CALL']("test param")
        // or
        versionName VERConsts['NAME']
    }
}

那么,versionName将拥有调用结果。

注:

  • VERConsts['NAME'] = getVersionName()会调用getVersionName()并存储其结果。在脚本中使用它,例如:versionName VERConsts['NAME']将分配存储的值。
  • VERConsts['NAME_CALL']将相反地存储对函数的引用。在您的脚本中使用VERConsts['NAME_CALL']()将实际调用该函数并将结果分配给您的变量。

前者将导致整个脚本分配相同的值,而后者可能会导致不同的值(例如,如果在运行脚本时有人推送另一个版本)。


我实际上发现这比其他答案更有用,可以在项目之间共享构建脚本的帮助方法。 - Travis Castillo
这个答案对我来说最有帮助了。谢谢! - Billy Lazzaro
你能给一个非Android的例子吗?versionName VERConsts 'NAME_CALL'是什么?如何在干净的Java Gradle项目中运行它? - Kamil Nękanowicz
我正在尝试使用另一个.gradle应用逻辑。有没有办法从作为依赖项拉入的jar文件中包含的“other.gradle”资源中应用? - Andy Dingfelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接