多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

 

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

上一篇:错误处理:java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag


下一篇:针对媒体不实报道误导大众--抹黑C#工资垫底