多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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM