• 多flavor导致的源码依赖问题-- Cannot choose between the following configurations of project :sample:


    一、背景:

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

      我们的主工程有如下配置,它依赖了一个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'
  • 相关阅读:
    gettid 和pthread_self的区别
    UDP socket也可以使用connect系统调用
    TCP协议中的SO_LINGER选项
    pthread_key_t和pthread_key_create()详解
    1、Window10 Electron 开发环境搭建
    如何查看Windows下端口占用
    Servlet 中使用POI生成Excel
    JdbcTemplate 操作Oracle Blob
    RedHat 6.5 离线安装 apache2.4.23
    windows下端口被占用的解决方法
  • 原文地址:https://www.cnblogs.com/yrstudy/p/11608106.html
Copyright © 2020-2023  润新知