EasyDependency:簡單優雅管理組件化的依賴配置

在實際的開發中,隨着項目的複雜度的提高,爲了維護代碼的複用率和可讀性,項目的組件化是一種比較受歡迎的解決方案。html

在這個過程當中,一個小的問題是關於組件化工程的依賴管理。隨着工程中的模塊愈來愈多,整個工程的編譯時間會增多(雖然Android studio在這方面的改進已經愈來愈好)。爲了縮短編譯的時長,一種簡單的解決方案是:git

  • 經過aar/jar遠程構件依賴模塊

這種方案的好處是,項目依賴的是已經編譯完成的代碼,每次編譯工程的時候,這些構件不須要參與編譯的過程,能夠直接縮短期。可是使用這種解決方案以後又會存在如下兩個問題:github

  • 開發階段,aar/jar包不穩定,須要頻繁的修改和發版
  • aar/jar遠程構件依賴不方便調試(好比沒法快速插入調試代碼、調試日誌)

EasyDependency 就是一個爲了解決以上的問題而誕生的輕量級的簡潔解決方案。api

關於EasyDependency

EasyDependency 是一個基於groovy實現的gradle插件,能夠直接在已有的Android studio的項目中快速接入使用。目前,EasyDependency主要提供如下兩個功能:app

發佈構件

目前關於發佈aar/jar構件到maven的倉庫插件、腳本和教程多而雜亂,EasyDependency內部集成了簡單使用的上傳構件的功能,只須要提供必要的參數便可實現功能。具體能夠參考下面的使用方案。maven

動態更換依賴配置

正如前面所說起的,當咱們使用aar依賴提升編譯速度的同時,咱們面臨了另外的兩個問題。EasyDependency內部對這個問題提供了本身的解決方案,即經過簡單的配置動態的更改項目實際所使用的模塊依賴。組件化

好比在項目中存在A、B兩個模塊,其中模塊A依賴模塊B。在模塊A的build.gradle文件中配置以下:gradle

dependencies {
    implementation project(':B') // 經過源碼依賴B模塊
    //implementation groupIdB:artifactIdB:versionB // 經過遠程構件依賴B模塊
}
複製代碼

在上面的配置中就是咱們常規的解決方案,當須要更換依賴的時候,咱們把其中的依賴方式註釋掉,只保留所須要的依賴方案。ui

若是項目中只有一兩個的模塊,而且彼此的依賴關係比較簡單的時候,這樣的方式簡單可用,可是,但項目中的模塊數多大十個左右的時候,再使用這樣的方式就會捉襟見肘了。spa

EasyDependency就是爲了簡單清晰集中的管理這種動態依賴配置問題的。EasyDependency內部實現原理以下:

  1. 在當前模塊中添加動態依賴的配置塊dynamicDependency(配置方法參考下文)
  2. 查詢當前模塊中全部的本地源碼依賴
  3. 比較本地依賴與配置塊,當對應的本地依賴所屬的配置塊的debuggable屬性是false的時候,表示須要使用遠程構件依賴替換本地源碼依賴。此時根據其餘的配置參數肯定遠程構件的地址進行依賴替換。關於依賴替換的實現,使用的是gradle當中的dependencySubstitution的api判斷

具體的使用方案,參考下面的使用方案。

EasyDependency快速接入使用

目前,EasyDependency已經發布到bintray上,你能夠快速的接入使用。

  1. 在根項目的build.gradle文件中添加依賴及插件使用的配置

    // 引入插件,注意這個插件只能在根項目的gradle文件中引入
    // 內部會完成根項目下的各個子模塊的配置
    apply plugin: 'easy-dependency'
    
    buildscript {
        repositories {
            ...
            // 添加倉庫地址
            jcenter()
        }
        dependencies {
            ...
            //添加依賴
            classpath 'tech.easily:EasyDependencyPlugin:1.0.1'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    複製代碼
  2. 配置發佈構件到maven倉庫

    在各個須要發佈構件到module的build.gradle文件中添加如下配置

    mavenPublish{
        version='0.0.1-SNAPSHOT' // 若是不包含SNAPSHOT,則發佈到release的倉庫
        groupId='your group id'
        artifactId='your artifact id' // 若是不配置,則使用模塊的名稱做爲其默認值
        userName="your maven repo user's name"
        password="your maven repo password"
        releaseRepo="your release maven repo address"
        snapshotRepo="your snapshot maven repo address"
    }
    複製代碼

    若是項目須要配置的模塊不少的時候,咱們能夠直接經過下面的方式直接在根項目的build.gradle文件中配置

    subprojects {
    	// EasyDependency不會在這個模塊中添加發布構件的功能,因此這裏添加配置參數的時候須要排除
        if (project.name == "app") {
            return
        }
        mavenPublish {
            // 這裏直接使用模塊名稱做爲artifactId
            version='0.0.1-SNAPSHOT' 
            groupId = maven.config.groupId
            releaseRepo = maven.config.releaseRepo
            snapshotRepo = maven.config.snapshotRepo
        }
    }
    複製代碼

    若是每一個模塊的發佈版本號並不一致的狀況下,咱們能夠把上面的version配置移除,同時在各個模塊的build.gradle文件中分別添加如下的配置便可

    mavenPublish.version="0.0.3-SNAPSHOT"
    複製代碼

    這樣可以更加統一的管理,複用配置

  3. 配置動態替換依賴

    在各個須要進行動態依賴替換的module的build.gradle文件中添加如下配置

    //須要把本地源碼的依賴配置上
    //這樣子哪怕插件移除了,代碼也能正常工做
    dependencies {
        implementation project(':B')
    }
    
    dynamicDependency{
        //這個key對應的是本地模塊的名稱(注意這個本地模塊應該在依賴當中有配置,如上所示)
        B{
            debuggable=true //若是是true,則使用本地模塊做爲依賴參與編譯,不然使用下面的配置獲取遠程的構件做爲依賴參與編譯
            groupId="target archive's group id"
            artifactId="target archive's archive id" // 默認使用模塊的名稱做爲其值
            version="target archive's version"
        }
        // 若是有更多的模塊須要進行動態依賴配置,則繼續添加對應的配置快在裏面便可
        ...
    }
    複製代碼

    一樣的,若是須要多個模塊的依賴實現動態修改的時候,能夠參考上面的統一配置的方案。

以上就是關於EasyDependency的實現和使用說明,歡迎關注和star個人GitHub倉庫EasyDependency

若是你對應這個方案的實現/使用有什麼問題,歡迎提issue。若是你在處理組件化項目的依賴過程當中遇到其餘須要解決的問題也歡迎提出,我會讓它更加完善。

若是對於組件化工程的依賴問題你有其餘的解決方案,歡迎一塊兒交流,謝謝!

相關文章
相關標籤/搜索