【问题标题】:Gradle dependency based on both build type and flavor基于构建类型和风格的 Gradle 依赖关系
【发布时间】:2015-03-24 03:24:18
【问题描述】:

我有几种构建类型:debugrelease。 我也有pubdev两种口味。

pub 风格的应用程序依赖于 pub 库,dev 风格的应用程序类似。 现在我希望 debug 构建类型的应用程序依赖于库的 debug 构建。以下方法不起作用:

pubReleaseCompile project(path: ':common', configuration: "pubRelease")
devReleaseCompile project(path: ':common', configuration: "devRelease")
pubDebugCompile project(path: ':common', configuration: "pubDebug")
devDebugCompile project(path: ':common', configuration: "devDebug")

注意:该库设置为编译所有变体。

有没有办法根据风格和构建类型指定条件项目依赖关系?

编辑:为避免混淆,请遵循我当前正在使用的项目中的相关build.gradle 文件。

project/common/build.gradle(库)

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.hugo' // annotation-based code generated logs only in debug build

android {
  defaultPublishConfig "pubRelease"
  publishNonDefault true // four variants of the library are built

  buildTypes {
    debug {}
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
  }
  productFlavors {
    pub {
      // custom build config fields
    }
    dev {
      // custom build config fields
    }
  }
}

dependencies {
  // ...
}

project/parent/build.gradle(使用该库的应用模块之一)

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'

android {
  // ...

  signingConfigs {
    release {
      // ...
    }
  }

  buildTypes {
    release {
      signingConfig signingConfigs.release
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
      shrinkResources true
      minifyEnabled true
    }
    debug {
      versionNameSuffix '-debug'
    }
  }
  productFlavors {
    pub {
      // custom res values
    }
    dev {
      // custom res values
    }
  }
}

dependencies {
  // ...
  pubCompile project(path: ':common', configuration: "pubRelease")
  devCompile project(path: ':common', configuration: "devRelease")
}

【问题讨论】:

  • 它说什么错误?是Could not find method pubReleaseCompile () for arguments xxx吗?
  • Gradle DSL method not found: 'pubReleaseCompile()'.
  • 知道怎么做吗?
  • 很遗憾,没有,但目前我只将它用于Hugo,所以它并不重要。如果你愿意,我会发布赏金。
  • 我非常想要。

标签: android gradle


【解决方案1】:

适用于 Gradle 3.x.x 的 Android 插件

构建插件 3.x.x 使用变体感知依赖解析,因此应用模块的devDebug 变体将自动使用其库模块依赖的devDebug 变体。要回答这个问题,这就足够了:

implementation project(':common')

在此处阅读更多信息:https://developer.android.com/studio/build/dependencies.html#variant_aware

原答案

我在这里找到了解决方案:https://github.com/JakeWharton/u2020/blob/master/build.gradle

更多关于为什么我的原始代码不够用的信息可以在这里找到:https://code.google.com/p/android/issues/detail?id=162285

工作解决方案:

configurations {
  pubDebugCompile
  devDebugCompile
  pubReleaseCompile
  devReleaseCompile
}

dependencies {
  pubReleaseCompile project(path: ':common', configuration: "pubRelease")
  devReleaseCompile project(path: ':common', configuration: "devRelease")
  pubDebugCompile project(path: ':common', configuration: "pubDebug")
  devDebugCompile project(path: ':common', configuration: "devDebug")
}

【讨论】:

【解决方案2】:

首先定义各种构建类型:

buildTypes {
    pubRelease {
        //config
    }
    devRelease {
        //config
    }
}

创建一个仅针对特定 buildType 和风味执行的任务:

task pubReleaseTask << {
    //code
}

task devReleaseTask << {
    //code
}

你可以动态添加依赖:

tasks.whenTaskAdded { task ->
    if (task.name == 'pubRelease') {
        task.dependsOn pubReleaseTask
    }
    if (task.name == 'devRelease') {
        task.dependsOn devReleaseTask 
    }
}

【讨论】:

  • 如果我这样做了gradlew clean build,这不会一次添加所有依赖项吗?
  • 两个问题:1) 回复:更新:但如果我正在做一个完整的构建,它将完成所有任务,所以第一个风味特定任务会得到它自己的依赖和每个连续的风味特定任务都会得到它自己的加上已经添加的任何内容。这是正确的还是不正确的? 2) 我应该在哪些任务上挂上新任务?
  • @EugenPechanec - 请找到更新的答案并提供更多解释。
  • 所以我在 app 模块 build.gradle 的末尾添加了this。不会编译,没有找到库资源。您是从哪里想到“pubRelease”和“devRelease”任务名称的?项目中没有此类任务。 (非常感谢您的耐心等待。)
  • 另外请注意,构建类型releasedebugflavorspubdev
【解决方案3】:

看看Multi-flavor variants 您不应该为此使用 buildTypes。 但是你可以定义多种口味:

flavorDimensions "first", "second"

productFlavors {
    pub {
        flavorDimension "first"
    }
    dev {
        flavorDimension "first"
    }
    deb {
        flavorDimension "second"
    }
    rel {
        flavorDimension "second"
    }
}

然后你可以像这样将依赖项添加到你的库中

pubRelCompile project(path: ':common', configuration: "pubRel")
devRelCompile project(path: ':common', configuration: "devRel")
pubDebCompile project(path: ':common', configuration: "pubDeb")
devDebCompile project(path: ':common', configuration: "devDeb")

【讨论】:

  • 这将在应用程序的pubDebugpubRelease 变体中包含pubRelease 库。这是我已经在使用的。我正在寻找的是在pubRelease 应用程序中包含pubRelease 库和pubDebug 应用程序中的pubDebug 库。
  • 重新编辑:不能那样做。必须只使用 buildTypes,之后我必须为过去的口味维护重复的值。这不是一个选项。
  • 这将生成两倍的 APK,几乎没有任何收益。查看我的解决方案和相关来源。
【解决方案4】:

跟进@doopye的例子,假设你只想编译一种风格的leanback,你可以参考下面的sn-p:

applicationVariants.all { variant ->
    def flavorString = ""
    def flavors = variant.productFlavors
    for (int i = 0; i < flavors.size(); i++) {
        flavorString += flavors[i].name;
    }

    if (flavorString.equalsIgnoreCase("pubdeb")) {
        dependencies {
            compile('com.android.support:leanback-v17:22.2.1')
        }
    }
}

【讨论】:

  • 我收到此错误:无法更改配置 ':app:compile' 的依赖项后,它已包含在依赖项解析中。
  • 已经有(并且是 4 年前)这样做的标准方法:dependencies { pubdebCompile('com.android.support:leanback-v17:22.2.1') } 问题要求您已经知道如何根据风味声明依赖关系。我要投反对票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多