2013-06-22 63 views
4

今天我開始將我們的項目轉換爲使用gradle構建系統。我不能改變項目結構,和我有不同的味道,所以我想知道我怎麼能覆蓋爲「開發」和「刺」的sourceset,因爲這顯然是行不通:Gradle productflavors源代碼集和舊項目結構

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.2' 
    } 
} 

apply plugin: 'android' 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17" 

    dependencies { 
     compile project(':ABS') 
     compile project(':google-play-services_lib') 
     compile project(':MergeAdapter') 
     compile fileTree(dir: 'libs', include: '*.jar') 
    } 

    signingConfigs { 
     release { 
      storeFile file("myapp.keystore") 
        storePassword "**********" 
        keyAlias "**********" 
        keyPassword "**********" 
     } 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aild.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     dev { 
      java.srcDirs = ['src-dev'] 
     } 

     prod { 
      java.srcDirs = ['src-prod'] 
     } 

     instrumentTest.setRoot('tests') 
    } 

    productFlavors { 
     dev { 
      packageName "com.myapp.dev" 
     } 

     prod { 
      packageName "com.myapp" 
     } 
    } 

    buildTypes { 
     release { 
      signingConfig signingConfigs.release 
     } 
    } 
} 

這給我下面的錯誤:

Cannot add a AndroidSourceSet with name 'dev' as a AndroidSourceSet with that name already exists. 

的事情是,我不能使用新的項目結構,我堅持這一個,所以我怎麼在這裏覆蓋源目錄,以便它包括開發人員版,src-dev和prod版本src-prod(而不是src/main/java和src/dev/java或src/prod/java)

Thx!

編輯:src-prod和src-dev目錄只包含具有用於指向不同環境的常量的類。我將使用資產(dev env的不同圖標)做同樣的工作

+0

android flavors demo http://goo.gl/5NSnEM – nitesh

回答

10

您需要首先聲明您的風味,然後自定義sourceSets。

發生什麼事是,當你自定義sourceSets時,它創建了android.sourceSets.dev,但是當創建android.productFlavors.dev時,它嘗試創建一個匹配的android.sourceSets.dev並失敗(因爲它已經存在)。

我們無法真正知道已經創建的sourceSet意味着是同一件事,所以我們失敗了,而不是在您將其用於其他目的時用於該風格的sourceSet。

4

謝謝,這對我有用。

在我的舊式項目中,我需要爲亞馬遜和三星構建兩個res變體。現在有三個res文件夾包含一個帶有一些布爾標誌的flavors.xml文件。

res/values/flavors.xml 
res-samsung/values/flavors.xml 
res-amazon/values/flavors.xml 

的gradle這個文件首先定義口味:

productFlavors { 
    amazon { 
    } 

    samsung { 
    } 
} 

然後,在sourceSet關閉,我不加,但只是改變目錄爲隱含產生的風味sourceSets:

sourceSets { 
main { 
    manifest.srcFile 'AndroidManifest.xml' 
    java.srcDirs = ['src'] 
    resources.srcDirs = ['src'] 
    aidl.srcDirs = ['src'] 
    renderscript.srcDirs = ['src'] 
    res.srcDirs = ['res'] 
    assets.srcDirs = ['assets'] 
} 

samsung.res.srcDirs = ['res-samsung'] 
amazon.res.srcDirs = ['res-amazon'] 

instrumentTest.setRoot('tests') 
} 

Gradle的mergeXXXResources任務隨後支持res-xxx文件夾內容,因此我在適當的flavor口令中擁有所需的布爾標誌。