一、背景:

  当我们在源码依赖的时候经常会导致一些问题。

  我们的主工程有如下配置,它依赖了一个sample的本地工程

    flavorDimensions "demo"
productFlavors {
flavor1 {
dimension 'demo'
} flavor2 {
dimension 'demo'
}
} dependencies {
compile project(':sample')
}

  我们sample的本地工程配置如下

    flavorDimensions "demo2"
productFlavors {
flavor3 {
dimension 'demo2'
}
flavo4 {
dimension 'demo2'
}
}

  这时候你去assemble代码的时候,你会发现报出了如下的错误

  > Could not resolve project :sample.
Required by:
project :app
> Cannot choose between the following configurations of project :sample:

  这里的问题是,我们的主module无法判断,我们主module的flavor需要对应sample的那个flavor。那么我们需要怎么样解决这个问题呢?

二、解决思路

Gradle3.0以下

  我们通过这样引用本地工程

 dependencies {
    api project(path:':sample',configuration:"default")

}

同时在sample配置

   defaultPublishConfig "flavor3Release"

但这么写,你会发现一个非常奇葩的问题,你无法使用本地工程中的依赖,也就是依赖传递的问题(这里目前还没有implementation和api,只有compile)。

但终究是工程能够编译起来的。

Gradle3.0以上

  在gradle3.0以上,google为我们提供了一种变体感知的依赖管理机制。这其实与上面的强制指定有异曲同工之处,但无疑这一种更加先进。

  

    flavorDimensions "demo"            flavorDimensions "demo2"      
productFlavors {                productFlavors{
flavor1 {                    flavor3{
dimension 'demo'                dimension 'demo2'
}                         }
        
flavor2 {                   flavor4{
dimension 'demo'                dimension 'demo2'
}                         }
}
                           }
dependencies {
compile project(':sample')
} app                         sample

  我们可以看到我们的两个module,他们的flavorDimensions和productFlavors中的内容均不一样,那我们应该如何适配那?

  使用missingDimensionStrategy和matchingFallbacks

  如果你的app module是这样的,与sample一样,那么gradle会自动帮你匹配。也就是flavor相同的匹配。

    flavorDimensions "demo2"
productFlavors {
flavor3 {
dimension 'demo2'
}
flavo4 {
dimension 'demo2'
}
}

  如果你的appmodule是这样的,flavorDimension不一致,而flavor一致。那你就需要使用 missingDimensionStrategy 'demo2', 'flavor3', 'flavor4'

flavoorDimensions "demo" 
productFlavors {
flavor3 {
dimension 'demo'
        missingDimensionStrategy 'demo2', 'flavor3'
        }
flavo4 {
dimension 'demo'         missingDimensionStrategy 'demo2', 'flavor4'    第一个参数是sample里面的flavordimensions,后面的可以依次填里面的flavor
        }
}

  如果你的appmodule是这样的,flavorDimension一致,而flavor不一致。那你就需要使用 matchingFallbacks

  flavorDimensions "demo2"
productFlavors {
flavor1 {
dimension 'demo2'
         matchingFallbacks = ['flavor3']
}
flavo2 {
dimension 'demo2'
         matchingFallbacks = ['flavor4']
}
}

  如果你遇到了我们上面的那种方式,那自然是两个都需要使用,这个就留给你们自己去尝试了。

  有的朋友又问了,那我的app没有flavor唉怎么办,那这种又是什么情况呢??自然是flavorDimensions和flavor都不相同,那我们只要在defaultConfig中添加即可

missingDimensionStrategy 'demo2', 'flavor3', 'flavor4'

多flavor导致的源码依赖问题-- Cannot choose between the following configurations of project :sample:的更多相关文章

  1. webpack源码-依赖收集

    webpack源码-依赖收集 version:3.12.0 程序主要流程: 触发make钩子 Compilation.js 执行EntryOptionPlugin 中注册的make钩子 执行compi ...

  2. 高德APP全链路源码依赖分析工程

    一.背景 高德 App 经过多年的发展,其代码量已达到数百万行级别,支撑了高德地图复杂的业务功能.但与此同时,随着团队的扩张和业务的复杂化,越来越碎片化的代码以及代码之间复杂的依赖关系带来诸多维护性问 ...

  3. 著名的安装制作软件InnoSetup的源码及示例源码-The installation of a well-known software s source code and sample InnoSetup source

    @echo off rem Inno Setup rem Copyright (C) 1997-2007 Jordan Russell rem Portions by Martijn Laan rem ...

  4. tomcat源码导入eclipse步骤

    1. 获取源代码 方式一:从官网http://tomcat.apache.org/download-70.cgi 直接下载,官网提供了Binary 和 Source Code两种下载方式,要研究tom ...

  5. Docker编译Android6.0源码

    docker环境配置 更正时区时间 # 查看当前时间 $ date # 修改当前时间 $ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ech ...

  6. Tomcat源码导入eclipse的步骤

    Tomcat源码导入eclipse 一.下载源码 1.  进入Apache 官网:http://tomcat.apache.org/ 2.  在左边侧选择要下载的源码的版本. 3.  或者直接通过Ar ...

  7. eclipse 导入tomcat7源码

    导入tomcat的源码其实说简单也不简单,说不简单也简单,主要还是环境问题,中间花费了我很多时间,网上找了很多都没什么用,参考一些文章,然后自己慢慢摸索出来的. 环境:(1)jdk:jdk1.6.0_ ...

  8. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  9. Linux 下源码编译FFMEG

    目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...

随机推荐

  1. 301重定向将不带www的域名跳转到www的域名,403 Forbidden You don’t have permission to access the URL on this server

    博客搬迁,给你带来的不便,敬请谅解! http://www.suanliutudousi.com/2017/11/14/301%e9%87%8d%e5%ae%9a%e5%90%91%e5%b0%86% ...

  2. linux Jenkins搭建

    安装jdk 下载jdk   解压 jdk1.8 vim /etc/profile export JAVA_HOME=/usr/local/java/jdk1.8.0_111export CLASSPA ...

  3. ArcMap属性表操作接口ITableWindow3

    ITableWindow3 tableWindow3 = new TableWindowClass                {                    //Layer = laye ...

  4. How to easily Detect Objects with Deep Learning on Raspberry Pi

    https://medium.com/nanonets/how-to-easily-detect-objects-with-deep-learning-on-raspberrypi-225f29635 ...

  5. Python第九节 条件和循环

    while...else 当满足while循环条件的时候执行循环体内的语句,否则执行else的语句例如下面的例子: count = 1 while count <= 5: print(" ...

  6. 浅析php-fpm和fastcgi的关系

    先讲讲CGI吧 浏览器向web server发起请求的时候,要有url,header,params等等吧,为什么有这些数据呢,这就是CGI的事了,CGI就规定了,传哪些数据,用什么样的格式传输 web ...

  7. sum - 计算文件的校验和,以及文件占用的块数

    总览 (SYNOPSIS) ../src/sum [OPTION]... [FILE]... 描述 (DESCRIPTION) 显示 每个 文件 FILE 的 校验和, 以及 他们 占用的 块数. - ...

  8. TypeError: Object of type 'int32' is not JSON serializable

    将模型用flask封装,返回json时报错:TypeError: Object of type 'int32' is not JSON serializable 网上搜索出的解决方案:重写json.J ...

  9. Vuex白话教程第六讲:Vuex的管理员Module(实战篇)

    写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...

  10. Go: Println 与 Printf 的区别

    Go 学习笔记:Println 与 Printf 的区别,以及 Printf 的详细用法 2017-12-19 15:39:05 zgh0711 阅读数 26255更多 分类专栏: Go   版权声明 ...