Android 定义多个变体的依赖项

Android 定义多个变体的依赖项,android,gradle,Android,Gradle,假设我们有四种构建类型:调试、qa、测试版和发布版 我们可以定义特定变体的依赖项,如下所示: dependencies { // These dependencies are only included for debug and qa builds debugCompile 'com.example:lib:1.0.0' qaCompile 'com.example:lib:1.0.0' } 有没有一种方法可以在不重复工件描述符的情况下为多个变体编译这些依赖关系 例如

假设我们有四种构建类型:调试、qa、测试版和发布版

我们可以定义特定变体的依赖项,如下所示:

dependencies {
    // These dependencies are only included for debug and qa builds
    debugCompile 'com.example:lib:1.0.0'
    qaCompile 'com.example:lib:1.0.0'
}
有没有一种方法可以在不重复工件描述符的情况下为多个变体编译这些依赖关系

例如,我想这样做:

dependencies {
   internalCompile 'com.example:lib:1.0.0'
}
其中,
internalCompile
将指定库包含在
debug
qa
构建中

我相信解决方案在于定义一个新的,但是如果我创建一个
internalCompile
配置,我不确定如何确保这些依赖项只针对
qa
debug
构建进行编译

扩展自

此配置扩展自的配置的名称。超级配置的工件也可在此配置中使用

或者: 您可以创建一组工件描述符,并将其用于多种配置

List internalCompile = ["com.example:lib:1.0.0",
               "commons-cli:commons-cli:1.0@jar",
               "org.apache.ant:ant:1.9.4@jar"]

List somethingElse = ['org.hibernate:hibernate:3.0.5@jar',
                  'somegroup:someorg:1.0@jar']

dependencies {
    debugCompile internalCompile
    qaCompile internalCompile, somethingElse
}

如果我正确解释了文档,那么已经有了构建类型的配置(例如,
configurations.qacomile
)。您可以查看这些产品的对象模型,看看是否可以装配一个复制机制,类似于我们如何基于现有产品定义新的产品风格。然后,您可以使用一种配置(例如,
debugCompile
)构建公共部分,使用Groovy代码将该设置克隆到另一种配置(例如,
qacomile
),然后继续定义唯一的依赖项。感谢@commonware,我没有尝试复制版本之间的依赖关系,因为我希望Gradle内置了一种更直接的方法。我的另一个想法是利用flavor维度定义一个可用于这些依赖项的“内部”维度。flavor方法的问题是,您将永远不得不在构建内容中处理这种风格(例如,您不是在构建
debug
,而是在构建
debugInternal
),如果我理解你的计划。另一个选项:
qacomile
和kin支持工件名称数组,以及单个名称。您可以在一个点定义数组,然后应用它两次。这并不能精确地解决您所关心的问题,但是如果您对确保公共依赖项只声明一次有兴趣,那么它将是解决该问题的另一种方法。我同意,由于您提到的原因,口味选项并不理想,这也是我一直希望避免它的原因。Gradle配置可以相互“扩展”。您可以让下游配置继承上游配置+其他内容的所有内容,也可以声明每个人都继承的新公共配置。您可以这样更改现有配置的继承吗?我们没有直接定义
debugCompile
qacomile
,它们是由Android插件创建的。我知道你可以添加一个
extendsFrom
来配置java插件添加的。我还没有测试过android配置。还添加了另一种方法。我之前假设
extendsFrom
类似于Java继承-每个配置只有一个父级。不幸的是,它看起来不起作用,我认为这是由于@Tanis.7x的时间问题。据我所知,android配置是在plugin
apply()
期间添加的。想知道是否有办法确保在
apply()
之后运行
extendsFrom
。第二种方法不适合您吗?@Tanis.7x我自己没有尝试过,但值得一试:
qacile.extendsFrom(internalCompile)
。如果配置已经存在,安装关闭可能不会运行(您可以通过在内部添加
println
轻松确认)。
List internalCompile = ["com.example:lib:1.0.0",
               "commons-cli:commons-cli:1.0@jar",
               "org.apache.ant:ant:1.9.4@jar"]

List somethingElse = ['org.hibernate:hibernate:3.0.5@jar',
                  'somegroup:someorg:1.0@jar']

dependencies {
    debugCompile internalCompile
    qaCompile internalCompile, somethingElse
}