一、背景:

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

  我们的主工程有如下配置,它依赖了一个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. 纯css设置元素过渡效果

    1.首先,先设置一个div,待会我们使用css3给这个div设置过渡效果. 2.然后给div设置宽高和背景,这里我就设置成200像素,深粉色. 3.接着开始设置transition属性,通过这个属性就 ...

  2. CG-CTF misc部分wp

    将Misc剥离出来了,已完结(coding gay不想做了) MISC1,图种一听图种,现将图片的GIF改为zip,然后解压得到另一张动图看动图最后一句话为‘都深深的出卖了我’,得到 flag2, 丘 ...

  3. JS综合面试题1

    function foo(){ getName = function () { alert(1); }; return this; } Foo.getName = function(){ alert( ...

  4. 案例- CSS 三角加强

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. react使用总结

    1.拿到页面首先需要设计好,每个组件该怎么实现,划分好组件可以减少重复代码,有的时候需要和后端确认才能形成正确的划分 2.页面上的需要展示的数据都是由后端数据而来,所以任何增删改查的数据都要从后端重新 ...

  6. 2018-8-29-Roslyn-静态分析

    title author date CreateTime categories Roslyn 静态分析 lindexi 2018-08-29 09:10:19 +0800 2018-03-13 14: ...

  7. Manjaro配置中国源

    1.自动寻找中国源 sudo pacman-mirrors -i -c China -m rank//更新镜像排名sudo vim /etc/pacman.d/mirrorlist //查看选择的源s ...

  8. spark on yarn提交任务时报ClosedChannelException解决方案

    spark2.1出来了,想玩玩就搭了个原生的apache集群,但在standalone模式下没有任何问题,基于apache hadoop 2.7.3使用spark on yarn一直报这个错.(Jav ...

  9. xfce4之whisker不显示自定义启动器的解决

    对某些启动比较麻烦的程序,想创建个启动器显示在whisker里,这样就能快速启动了. 通常自己创建的desktop文件可以放~/.local/share/applications里,但是按下面这个创建 ...

  10. 关于js中Ajax的同步、异步使用

    下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...