設(shè)定共用庫
接續(xù)前一篇文章,雖然源代碼編寫已大致滿足工作上的需求,但是還有一項(xiàng)未來潛在性的需求要確認(rèn)是否能夠達(dá)成。目前在開發(fā)設(shè)計(jì)上的主流是面向?qū)ο缶幊蹋嫦驅(qū)ο缶幊痰幕揪袷翘岣咧赜眯裕簿褪窃谠O(shè)計(jì)時(shí)要讓源代碼盡可能地異中求同。所以在不斷地重構(gòu)之下就會(huì)形成很多共用的 Class,共用的 Class 集合起來就會(huì)形成一個(gè)共用的 Package 來讓不同的源代碼項(xiàng)目來引用。
在 Android Studio 中項(xiàng)目文件結(jié)構(gòu)的概念和 Eclipse 不太一樣,Eclipse 可以在同一個(gè) Workspace 里加入各種不同類型的源代碼項(xiàng)目,并透過 Working Set 來做項(xiàng)目檔的管理。在 Android Studio 里,Project 可類比成 Eclipse 的 Workspace、Module 則可類比成 Eclipse 的 Project。Android Studio 的 Project 雖然有像是 Working Set 的 Group 功能,但是以 Android Studio 的項(xiàng)目結(jié)構(gòu)來看,似乎不太適合套用 Eclipse 的 Workspace 模式來管理,比較偏向一個(gè)項(xiàng)目開啟一個(gè) IDE 的 Instance。
如果要配合 Android Studio 源代碼項(xiàng)目結(jié)構(gòu)的特性來架構(gòu)程序,就會(huì)形成一個(gè)問題是:跨項(xiàng)目共用的庫文件夾結(jié)構(gòu)如何規(guī)劃?嚴(yán)格地來說,這不應(yīng)該是一個(gè)問題,既然是要被跨項(xiàng)目使用,在被產(chǎn)品項(xiàng)目引用之前,就應(yīng)該是處于經(jīng)過測(cè)試、編譯好的狀態(tài),需要使用的開發(fā)人員只要取得 Binary 檔就行了。
只是現(xiàn)實(shí)和理想畢竟有差距,在庫的初期大多是透過各個(gè)產(chǎn)品項(xiàng)目來累積經(jīng)驗(yàn),利用重構(gòu)的手法把可以共用的部份抽取出來單獨(dú)地放在庫的項(xiàng)目里。在這種情況下,很多的設(shè)計(jì)思考是不周全的,所以需要在后續(xù)的產(chǎn)品項(xiàng)目中來發(fā)掘問題、持續(xù)地修正。
這時(shí)候,如果引用的是 Binary 文件在調(diào)試上就不是那么地直接,使用原始碼來開發(fā)會(huì)是一項(xiàng)可預(yù)見的需求。要引用原始碼勢(shì)必就會(huì)需要把不在目前 Android 項(xiàng)目文件夾下的 Module 包含進(jìn)來。
所以為了這個(gè)問題,在閱讀了 JetBrains 的說明文件后,試了以下幾個(gè) Android Studio 上的功能:
【File -> New -> Import Module...】
【File -> Project Structure... -> Modules -> Add】
【Gradle Tool Window -> Attach Gradle project】
但不知道是不是 IntelliJ IDEA 和 Gradle 項(xiàng)目整合性還不夠完整的關(guān)系,都會(huì)出現(xiàn)一些顯示不如預(yù)期或沒有反應(yīng)的情況。唯一比較滿意的是透過【Project Structure】的 Menu 功能,在匯入 Module 時(shí)選擇已經(jīng)有與 IDE 連結(jié)所產(chǎn)生的 *.iml 文件,而不是選擇 Gradle 的 build.gradle。只可惜這項(xiàng)功能在 Android 類型的項(xiàng)目里,【Project Structure】的畫面被調(diào)整過了,沒有辦法使用。
于是就退而求其次,改為手動(dòng)編輯 Gradle Root Project 下的 settings.gradle。在 settings.gradle 里增加以下內(nèi)容,其中 utils 是 IDE 里 Module 的名稱,必須要是一個(gè) Gradle 的 Project。new File 里的參數(shù)是 Gradle Project 所在的路徑,可以是絕對(duì)路徑,或是相對(duì)于 settings.gradle 所在的路徑。
include ':utils'
project(':utils').projectDir = new File('../shared/utils')
以上的范例在實(shí)體的路徑中會(huì)呈現(xiàn)以下示范的結(jié)構(gòu):
WebProject
├── build.gradle
├── settings.gradle
├── web-module
│ ├── build.gradle
│ └── src
│ ├── main
│ └── test
├── common-module
│ ├── build.gradle
│ └── src
│ ├── main
│ └── test
shared
└── utils
├── build.gradle
└── src
├── main
└── test
修改好了之后,按下 Toolbar 上的 Sync Project with Gradle Files 圖示,在 Project Tool Window 就可以看到在原本樹狀結(jié)構(gòu)第一階只有 Root Project 一項(xiàng),更新后多了一個(gè)平行的 utils 項(xiàng)目。
接下來就可以新增 Gradle Project 間的依存關(guān)系,原本應(yīng)該可以透過【Project Structure】的 Menu 功能來修改,但是在 “以匯入方式產(chǎn)生的純 Web 項(xiàng)目” 的情況下,無法將新增的 Depedencies 資訊反映回 Module 所對(duì)應(yīng)的 build.gradle,應(yīng)該是 IDE 的功能不正常造成的。這會(huì)使 CI 系統(tǒng)與開發(fā)時(shí)的建置結(jié)果出現(xiàn)不一致的情況,所以保險(xiǎn)的作法還是手動(dòng)編輯 build.gradle,要增加的內(nèi)容可以參考以下的范例:
dependencies {
compile project(':utils')
}
如果要參照的函式庫只是使用在測(cè)試的目的上,則 compile 可以更換為 testCompile。
到目前為止,共用函式庫的問題已經(jīng)有了一個(gè)明確的解決方案,接下來將會(huì)進(jìn)入到下一個(gè)研究主題:調(diào)試。