Stark Wong 的個人開發網站 | |||||||||||||||||||||
|
|||||||||||||||||||||
此頁面:更新於 2023 年 8 月 7 日 23 時 21 分 33 秒,頁面處理需時 0.0018 秒 | |||||||||||||||||||||
網站內容版權所有(C)Stark Wong。頁面(不包括檔案)可自由連結。網站系統版本 1.90-AngularJSBase (2015/9/27) | |||||||||||||||||||||
網站地圖 |
我們最近用 Kotlin 開發了一個程式庫,不過當把程式庫提供予其他團隊整合時發現我們用的 Kotlin 版本太新 (1.7.10),導致他們也要升級 Kotlin 版本,而升級 Kotlin 版本則需要同時升級 Gradle 及 Android Gradle Plugin 版本,然而升級 AGP 後則因為他們的程式含本端 aar 而導致編譯失敗。官方的解決方法是每個本端 aar 都開一個 module,這對於只用一兩個本端 aar 的開發者是沒什麼問題,但比較大的專案往往會從第三方取得 aar,結果會有超過 10 個 aar,這樣每個 aar 都開一個 module 的話看起來會比較亂。另一個方法就是將 aar 放在 maven repository,不過要為這個原因而架一個網站伺服器來放 aar 又是有點過份。不過其實 Gradle 是支援本端 maven repository 的,只需要將本來放在網站伺服器上的檔案放在指定的目錄下就可以,而且這個目錄可以相對於專案的目錄,其他開發者從 VCS checkout 專案後不需要進行任何修改即可進行編譯。
首先說一下目錄結構,將 maven 的檔案放入與專案的 app 目錄相同層級就可以,以下是一個例子:
AndroidProject
|-app
|-build
|-maven
| |-com
| |-amulyakhare
| |-textdrawable
| |-1.0.1
| |-textdrawable-1.0.1.aar
| |-textdrawable-1.0.1.pom
|-build.gradle
Maven Artifact 的格式為 ‘groupId:artifactId:version’,在以上例子就是 ‘com.amulyakhare:textdrawable:1.0.1’,也就是在 build.gradle 裡 implementation / compileOnly 裡的那個。
至於 pom 檔案可以用簡單幾句描述這個 Artifact 的內容,另可以宣告這個 Artifact 的相依性,令 Gradle 會自動引用這個 Artifact 所需的其他 Artifact。以下是 pom 檔案的例子:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.amulyakhare</groupId>
<artifactId>textdrawable</artifactId>
<version>1.0.1</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>androidx.fragment</groupId>
<artifactId>fragment</artifactId>
<version>1.3.6</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
這裡的 groupId、artifactId 和 version 必須與目錄結構相同,而 dependencies 裡面則為選填的內容,如無相依性則保留空白內容的 dependencies 即可。如以上的範例所示,每個相依性可以是在不同的 maven repository。
完成放置所有 aar 並編寫所需的 pom 後,最後的步驟就是在 build.gradle 引用這個本端資源庫。這個引用可以寫在全域或 app 的 build.gradle,這裡的示範是在 app 的 build.gradle (在 dependencies 上面):
repositories {
maven {
url "${rootProject.projectDir}/maven"
content {
includeGroup "com.amulyakhare"
}
}
}
利用 ${rootProject.projectDir} 變數就可以引用相對路徑的 maven repository。content 這個區塊可加可不加,加的話可以確保包含群組以外的 Artifact 不會嘗試在這個 maven repository 中下載。
引用後,要使用這個 Artifact 跟一般的使用方法完全相同:
implementation 'com.amulyakhare:textdrawable:1.0.1'
這樣就可以確保與以後的 Gradle / AGP 版本相容。