2013-09-25 39 views
7

我想知道是否有一種方法來爲根項目定義/注入它的依賴項中的一些屬性。更具體地說,我遇到的問題是一個庫項目必須知道在運行組裝/編譯任務之前是否需要「免費」或「專業」Java源和其他資源。有點像指定庫項目的產品風格(從它的父項目繼承而來),但Android插件不支持Gradle。更改庫項目結構,即創建「自由」和「專業」庫不是一種選擇。Gradle安卓依賴產品風格

編輯: 我已經設法到目前爲止達到的最好的是這樣的:

根:的build.gradle

android { 
    ... 

    productFlavors { 
     free, pro 
    } 

    sourceSets { 
     free { 
      project(':..:lib') { 
       groupFreePro = 'free' 
       // java.srcDirs = ['src', 'free/src'] 
      } 
     } 

     pro { 
      project(':..:lib') { 
       groupFreePro = 'pro' 
       // java.srcDirs = ['src', 'pro/src'] 
      } 
     } 
    ... 
    } 
} 

庫: gradle.build

android { 
    ... 
    sourceSets { 
     main { 
        java.srcDirs = [groupFreePro + '/src'] 
        res.srcDirs = [groupFreePro + '/res'] 
      } 
     } 
    ... 
    } 
} 

那個w唉我注入groupFreePro變量到lib項目中。但是這種方法有一個問題:

當lib項目得到它的android-> sourceSets任務時,groupFreePro總是被設置爲「pro」。我認爲這是因爲讀取了根項目中的所有sourceSets(而不僅僅是我想要構建的一個變體;例如「free」),因此最後的設置/任務總是覆蓋之前設置的groupFreePro的值。

如果我嘗試以其他方式設置groupFreePro的值,它要麼被覆蓋(就像在上面的例子中),要麼我不知道合適的任務/時間/地點,我應該把這個變量注入的東西將變量設置爲所需的值。在根項目中取消註釋java.srcDirs也無濟於事。

我試着自己解決這些問題,但我對Gradle真的很陌生,也缺乏適當的文檔(至少對於Android部分)讓我猜測大部分時間做什麼,所以我做了很多試驗和錯誤(但現在我有點卡住了)。

+0

您是否嘗試過製作「圖書館」項目的正常計劃。 Gradle的依賴管理意味着你可以使用任何非常像庫項目的項目。 –

+0

我有,但我有構建其他問題。我認爲問題在於,其他庫作爲常規項目構建,生成了構建系統(或我)不知道如何將其包含到主項目/ APK中的APK。我可能會再嘗試一次,看看我能否以不同的方式來解決問題。 – croc

+0

您可以共享該設置的代碼嗎? –

回答

6

這就是我現在已經解決了這個問題。這不是一個完美的解決方案,但現在已經夠好了。

更新!

我已經更新了包含最新0.9.2 Gradle插件和新(est)功能(大部分只是更新了庫構建腳本)的答案。

根: gradle.build

// global variables 
ext { 
    // can be set to default values or blank 
    groupFreePro = "free" 
} 

// start parameters 
println "Start parametes: tasks = " + gradle.startParameter.getTaskNames() 

gradle.startParameter.getTaskNames().each { task -> 
    if (task.contains("Free") || task.contains("F")) { 
     groupFreePro = "free" 
    } else if (task.contains("Pro") || task.contains("P")) { 
     groupFreePro = "pro" 
    } 
    println "groupFreePro = " + groupFreePro 
} 

android { 
... 
} 

task.contains("F")有處理縮寫版本或正在運行的任務(如果我們要運行腳本gradle aFD)。

ext下的全局變量可以設置爲默認值。在這種情況下,即使在任務名稱中沒有「Free/Pro」的情況下運行該腳本,它也應該可以正常工作。缺省值的缺點是,如果設置不正確(如果您希望構建僅在指定了任務名稱中的「Free/Pro」時才能工作),則構建可能不會崩潰。

庫: gradle.build

android { 
... 
    defaultPublishConfig groupFreePro + groupDebugRelease.capitalize() 

    productFlavors { 
     free 
     pro 
    } 

    ... 
    sourceSets { 
     main { 
      java.srcDirs = ['/src'] 
      res.srcDirs = ['/res'] 
     } 

     free { 
      java.srcDirs = ["free/src"] 
      res.srcDirs = ["free/res"] 
     } 

     pro { 
      java.srcDirs = ["pro/src"] 
      res.srcDirs = ["pro/res"] 
     } 
    } 
    ... 
} 

dependencies { 
    freeCompile fileTree(dir: 'free/lib', include: '*.jar') 
} 

更新:

庫現在包含 defaultPublishConfig這樣我就不需要指定

 java.srcDirs = ["src", groupFreePro + "/src"] 
     res.srcDirs = [groupFreePro + "/res"] 

更多,以及自定義現在使用風味編譯,即flavor1Compile(在dependencies塊中)。

dependencies塊的寫入compile project(path: ':project', configuration: 'flavor1Debug')並沒有真正對我們的工作,因爲你必須通過依賴通過這些選項的選擇,如果你有多種調味劑組/尺寸,這意味着更多或更少的所有味道組合的有在「非最後」依賴關係(即具有其他依賴關係(具有多種風格)的依賴關係)中處理。



println線正好看到,並確保正確的PARAMS傳遞。

該解決方案的向上(與Varun's相比)是您只需要運行一項(原始)任務。這也意味着它可以在Android Studio中正常工作(或者至少應該),沒有任何問題。

這種解決方案的缺點如果你想建立使用gradle assemble命令(或類似),其丟失的任務Free部分所有變體這是行不通的。我想這也可以被處理,但我沒有這樣做,因爲目前的解決方案對我來說是足夠好的(儘管如果我改進目前的解決方案,我也可能會更新這個答案)。

還有其他解決方案可能通過使用gradle.taskGraph.whenReady但我不知道如何正確設置srcDirs(特別是依賴關係)。建議歡迎。現在

+0

@ croc感謝您發佈此信息。 :D使它更容易。 – Varun

+0

我已經更新了答案,以包含新的0.9.2 Gradle插件的可能更改。建議/意見歡迎。 – croc

3

HereLibraryVarianthereApkVariant

綜觀上述DSL它看起來並不像多productFlavors支持對LibraryVariant類型..

如果您free/pro都不會發生太大的變化您可以創建一個aar專業版和免費版,並根據您的應用程序的需要使用它們作爲依賴項。

更新:

我在github上有一些代碼。它可以工作,但需要在應用程序上調用實際構建/組裝任務之前調用其他任務。 https://github.com/varunkochar/Trying-Android-Gradle/tree/master/FakeLibraryProductFlavors

UPDATE:

了最新的Android插件的gradle v0.9.0的LibraryProject現在 也支持同樣的DSL作爲ApplicationProject。因此,您可以使用最新版本 ,並使用庫項目的內置功能以 構建自定義風味。 來源:http://tools.android.com/tech-docs/new-build-system

+0

請參閱我的編輯,我擴大了我的問題。不幸的是,你的建議不足以使我找到一個可行的解決方案。你能否給我提供一個build.gradle腳本的工作示例? – croc

+0

@croc我不認爲你可以像這樣修改你的libraryproject的'srcDirs' ..當「gradle」加載並準備任務時,源會被設置。 盡我所知,如果您在'build.gradle'中編寫一些自定義任務以便爲您的庫項目設置'srcDirs',就可以解決這個問題。我會在下班後再試一試,如果我能正常工作,請在這裏發帖。同時你可以讓我們都知道你是否有任何進展。 – Varun

+0

這樣做,謝謝:)我希望Xavier(Android SDK Tech Lead)也會考慮這一點,因爲我很確定這是人們需要和/或期望從Android-Gradle構建系統(即使它不是這樣設計的)。 – croc

2

這功能現在可用於Android版Gradle插件0.9版之後。

到這裏看看:http://tools.android.com/tech-docs/new-build-system/migrating_to_09

複製粘貼此:

爲庫項目的DSL現在是相同的應用項目。這意味着你可以創建更多的構建類型,並創建風格。
- 您可以在buildTypes {...}容器中創建/配置更多構建類型。
- 您可以使用productFlavors {...}容器創建產品風味。
- 您可以使用signingConfigs {...}容器創建signingConfigs。

例如,如果你在你的庫:

android { 
    debug { 
    } 
    release { 
    } 
    debugSigningConfig { 
    } 
} 

您將其替換爲:

android { 
    buildTypes { 
     debug { 
     } 
     release { 
     } 
    } 
    signingConfigs { 
     debug { 
     } 
    } 
} 
+0

我知道,我正在研究它。 – croc