【问题标题】:Single flavor module based on multi flavor library in GradleGradle 中基于多风味库的单一风味模块
【发布时间】:2017-12-27 09:50:27
【问题描述】:

我正在开发多种口味的 app。 (下面的gradle文件)

它使用一个名为 tracker 的库,遵循相同的风格 internalexternal

现在是棘手的部分,来一个名为 feature 的新模块,这个模块没有味道,但它需要 tracker 作为依赖项

app.gradle:

android {

    buildTypes {
        debug {
        }
        release {
        }
    }

    flavorDimensions "target"

    productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

tracker.gradle:

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }

    flavorDimensions 'target'

     productFlavors {
        internal {
            dimension "target"
        }

        external {
            dimension "target"
        }
    }
}

feature.gradle:

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        compileSdkVersion rootProject.ext.compileSdkVersion
        buildToolsVersion rootProject.ext.buildToolsVersion

        defaultConfig {
            minSdkVersion rootProject.ext.minSdkVersion
            targetSdkVersion rootProject.ext.targetSdkVersion
            versionCode 1
            versionName "1.0"
            javaCompileOptions {
                annotationProcessorOptions {
                    includeCompileClasspath false
                }
            }
        }
    }

}

dependencies {
    implementation(
            [...]
            project(':tracker')
    )
}

这是我尝试gradle sync时的errors

Unable to resolve dependency for ':feature@debug/compileClasspath': Could not resolve project :tracker.

Could not resolve project :tracker.
Required by:
    project :feature
 > Project :feature declares a dependency from configuration 'implementation' to configuration 'externalRelease' which is not declared in the descriptor for project :tracker.

Unable to resolve dependency for ':feature@debugAndroidTest/compileClasspath': Could not resolve project :tracker.

Could not resolve project :tracker.
[...]

【问题讨论】:

  • 试试这个:implementation project(path: ':tracker', configuration: 'externalRelease')
  • > Project :feature 声明了从配置“implementation”到配置“externalRelease”的依赖关系,该依赖关系未在 project :tracker 的描述符中声明。
  • 阅读此博客medium.com/mindorks/…

标签: android gradle build.gradle android-productflavors android-build-flavors


【解决方案1】:

我的 gradle 版本是 4.4。

在文档中, Android developerAndroid Plugin DSL Reference 表明,应该添加以下代码。

missingDimensionStrategy 'external'
missingDimensionStrategy 'target'

Android developer link image

Android Plugin DSL Reference image

但这对我不起作用。最后我在 feature.gradle 中添加了后续代码。

flavorDimensions 'target'

 productFlavors {
    internal {
        dimension "target"
    }
}

【讨论】:

  • 这听起来不像是一个答案,或者?
  • 文档显示 missingDimensionStrategy 就是答案。也许它可以帮助不同 gradle 版本的人。
【解决方案2】:

从您的问题中,我得到的是您尝试将库 tracker 添加到您的 feature 模块作为依赖项。在您的feature.gradle 中尝试以下操作:

dependencies {
    implementation project(':tracker')
}

在 Gradle 3.0 中,有两个新关键字 implementationapicompile 关键字已弃用。您可以使用implementation 作为默认值。使用api 尤其是当您的项目中有传递依赖项时(模块 -> Lib1 -> Lib2),并且您需要告诉 Gradle 模块想要将该依赖项传递导出到其他模块,以便它们可以在以下位置使用运行时和编译时间。

很好的图解说明:

这是一篇很好的文章,说明了 implementationapi 关键字之间的区别:Implementation Vs Api in Android Gradle plugin 3.0

官方文档说明:

这里是来自官方文档Use the new dependency configurations的简要说明:

  • 实施:

    当您的模块配置实现依赖项时,它让 Gradle 知道该模块不想在编译时将依赖项泄漏给其他模块。也就是说,依赖项仅在运行时对其他模块可用。使用此依赖配置而不是 api 或 compile 可以显着缩短构建时间,因为它减少了构建系统需要重新编译的项目数量。例如,如果一个实现依赖改变了它的 API,Gradle 只会重新编译那个依赖和直接依赖它的模块。大多数应用和测试模块都应该使用这种配置。

  • api:

    当一个模块包含一个 api 依赖项时,它让 Gradle 知道该模块想要将该依赖项传递到其他模块,以便它们在运行时和编译时都可以使用它。此配置的行为就像 compile(现在已弃用),您通常应该只在库模块中使用它。这是因为,如果 api 依赖项更改了其外部 API,Gradle 会在编译时重新编译所有有权访问该依赖项的模块。因此,拥有大量 api 依赖项会显着增加构建时间。除非您想将依赖项的 API 公开给单独的测试模块,否则应用程序模块应改为使用实现依赖项。

希望这会有所帮助。


更新

为了完整起见,gradle 4.1 似乎存在一个已知问题。使用 4.3 版会有所帮助。感谢达米安。

【讨论】:

  • 更改为 api,这就是现在发生的情况:无法解析 ':feature@debug/compileClasspath' 的依赖关系:无法解析项目 :tracker。无法解析项目:tracker。要求:project :feature > 无法在 project :tracker 的以下配置中进行选择: - externalDebugApiElements - internalDebugApiElements 都匹配消费者属性:
  • gradle 4.1 存在一个已知问题,您将在 4.3 版本中正确
  • 啊!我知道了。很高兴您能够找出问题所在。
  • @DamienLocque 是否有任何链接可以让我阅读有关 gradle 4.1 的更多信息?
【解决方案3】:

好的,感谢@ramin-eftekhari,我设法让它工作了

https://github.com/luxsypher/gradle-flavor-dependency

【讨论】:

  • 您的示例实际上不起作用。如果你把一些类放到 :tracker 和 :feature 模块中,那么 :feature 模块看不到 :tracker module(
【解决方案4】:

尝试在应用中添加这个build.gradledefaultConfig块:

missingDimensionStrategy "internal"

【讨论】:

  • 我收到一个错误:请求的值列表不能为空
  • 在应用的 build.gradle 的调试和发布配置中使用以下 sn-p ` debug{ matchingFallbacks = ['release', 'debug'] } release{ matchingFallbacks = ['release', '调试'] } `
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多