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

LemonYang發表於2018-05-15

在實際的開發中,隨著專案的複雜度的提升,為了維護程式碼的複用率和可讀性,專案的元件化是一種比較受歡迎的解決方案。

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

  • 通過aar/jar遠端構件依賴模組

這種方案的好處是,專案依賴的是已經編譯完成的程式碼,每次編譯工程的時候,這些構件不需要參與編譯的過程,可以直接縮短時間。但是使用這種解決方案之後又會存在以下兩個問題:

  • 開發階段,aar/jar包不穩定,需要頻繁的修改和發版
  • aar/jar遠端構件依賴不方便除錯(比如無法快速插入除錯程式碼、除錯日誌)

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

關於EasyDependency

EasyDependency 是一個基於groovy實現的gradle外掛,可以直接在已有的Android studio的專案中快速接入使用。目前,EasyDependency主要提供以下兩個功能:

釋出構件

目前關於釋出aar/jar構件到maven的倉庫外掛、指令碼和教程多而雜亂,EasyDependency內部整合了簡單使用的上傳構件的功能,只需要提供必要的引數即可實現功能。具體可以參考下面的使用方案。

動態更換依賴配置

正如前面所提及的,當我們使用aar依賴提高編譯速度的同時,我們面臨了另外的兩個問題。EasyDependency內部對這個問題提供了自己的解決方案,即通過簡單的配置動態的更改專案實際所使用的模組依賴。

比如在專案中存在A、B兩個模組,其中模組A依賴模組B。在模組A的build.gradle檔案中配置如下:

dependencies {
    implementation project(':B') // 通過原始碼依賴B模組
    //implementation groupIdB:artifactIdB:versionB // 通過遠端構件依賴B模組
}
複製程式碼

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

如果專案中只有一兩個的模組,並且彼此的依賴關係比較簡單的時候,這樣的方式簡單可用,但是,但專案中的模組數多大十個左右的時候,再使用這樣的方式就會捉襟見肘了。

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。如果你在處理元件化專案的依賴過程中遇到其他需要解決的問題也歡迎提出,我會讓它更加完善。

如果對於元件化工程的依賴問題你有其他的解決方案,歡迎一起交流,謝謝!

相關文章