巧用 GitHub 创建自己的私人 Maven 仓库,及一些开发Library的建议
由于本人精力有限,如果內容有更新可能無法及時更新其他渠道的內容,請移步簡書 查看文章
2014年中的時候,當時國內使用 Android Studio 的人還沒有很多,很多人還沒處理嘗鮮的時候我開始把公司的項目遷移到 Android Studio 上了,開始了挺長一段踩坑的日子,開始接觸到了 Gradle,才開始了解到使用它來管理項目的依賴庫,由于在過程中有不少第三方庫是沒有將依賴包發布到 jCenter / Maven Central ,而且個人并不太喜歡把一整個開源項目添加到項目中,導致經常使用一些非官方倉庫,從而可能給后續維護帶來一些問題。
例如:
依賴庫可能有被做修改導致產生不必要的 Bug
依賴庫被作者從倉庫中刪掉
依賴庫更新不及時,升級依賴庫麻煩
后續跟進的開發者無法得知依賴庫的來源
等等一系統問題~
不地可以通過以下兩個解決方案解決:
給作者提 issues 讓作者將庫提交到 jCenter / Maven Central
自己 fork 一份代碼后提交到 JitPack 上
其實在過程中一真會出現一些倉庫地址的 URL 是 GitHub 的地址。
例如 Emojicon 庫,現在最新版本已經發布到 jCenter 了:
build.gradle
...allprojects {repositories {maven { url 'https://raw.githubusercontent.com/rockerhieu/mvn-repo/master/' }jcenter()} } ...app/build.gradle
...dependencies {...compile 'com.rockerhieu.emojicon:library:1.2' }最終定位到了這個倉庫 https://github.com/Goddchen/mvn-repo,后來對此進行了一些研究,了解到如何使用公共的 Git 倉庫發布依賴庫,后面我就把一些常用的庫自己編譯發布到自己的 GitHub 的 mvn-repo 倉庫上,同樣達到了相同的效果,并且更可控。
發布一個依賴庫到 mvn-repo
在 GitHub 創建 mvn-repo 倉庫
這一步就不詳述了,相信大家 Git 和 GitHub 使用肯定比我還熟練。
創建一個新的 Android Library 項目
由于本人已經不使用 Eclipse,所以肯定是使用 Android Studio。
創建一個 BlankApp 項目,這個項目是自己在開發過程中為了優化開發流程而寫的(之前的版本 被廢棄了,這個是重寫版,還在構思中)
這是目錄結構
. ├── BlankApp.iml ├── LICENSE ├── README.md ├── build │?? ├── generated │?? └── intermediates ├── build.gradle ├── examples │?? ├── build │?? ├── build.gradle │?? ├── examples.iml │?? ├── libs │?? ├── proguard-rules.pro │?? └── src ├── gradle │?? └── wrapper ├── gradle.properties ├── gradlew ├── gradlew.bat ├── library │?? ├── build │?? ├── build.gradle │?? ├── gradle.properties │?? ├── library.iml │?? ├── libs │?? ├── proguard-rules.pro │?? └── src ├── local.properties └── settings.gradlelibrary 就是一個 Android Library 的Module,examples 是一個Demo Module。
使用 gradle-mvn-push 編譯腳本
使用了Chris Banes 大神開發的 gradle-mvn-push Gradle 腳本,Chris Banes大神是 Android-PullToRefresh、PhotoView 等流行開源庫的作者。
在項目根目錄創建 gradle.properties 文件
COMPILE_SDK_VERSION=23 BUILD_TOOLS_VERSION=23.0.2 MIN_SDK_VERSION=14 TARGET_SDK_VERSION=23VERSION_NAME=0.0.1-alpha VERSION_CODE=1 GROUP=org.blankappPOM_DESCRIPTION= POM_URL=https://github.com/lijy91/BlankApp POM_SCM_URL=https://github.com/lijy91/BlankApp POM_SCM_CONNECTION=scm:git@github.com:lijy91/BlankApp.git POM_SCM_DEV_CONNECTION=scm:git@github.com:lijy91/BlankApp.git POM_LICENCE_NAME=The Apache Software License, Version 2.0 POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=lijy91 POM_DEVELOPER_NAME=JianyingLi <lijy91@foxmail.com>RELEASE_REPOSITORY_URL=file:///Users/Lijy91/Documents/Projects/mvn-repo/ SNAPSHOT_REPOSITORY_URL=file:///Users/Lijy91/Documents/Projects/mvn-repo/snapshots/RELEASE_REPOSITORY_URL 和 SNAPSHOT_REPOSITORY_URL 兩個配置分別是正式版和快照版的本地路徑。如果版本號后帶有 -SNAPSHOT 編譯后會發布到 SNAPSHOT_REPOSITORY_URL 相應的目錄下。
在 library 創建 gradle.properties 文件
app/library/gradle.properties
POM_NAME=BlankApp Library POM_ARTIFACT_ID=blankapp POM_PACKAGING=aar在 library 模塊調用 gradle-mvn-push 腳本
library/build.gradle
... apply from: 'https://raw.githubusercontent.com/lijy91/gradle-mvn-push/master/gradle-mvn-push.gradle'加在文件的未行即可,然后執行 Sync Now 即可
編譯到本地 Git 倉庫,并Push到遠程倉庫
Build
$ ./gradlew clean build uploadArchives執行些命令后,會在 /Users/Lijy91/Documents/Projects/mvn-repo/ 創建相關的文件
. ├── README.md └── org└── blankapp├── blankapp│?? ├── 0.0.1-alpha│?? │?? ├── blankapp-0.0.1-alpha-javadoc.jar│?? │?? ├── blankapp-0.0.1-alpha-javadoc.jar.md5│?? │?? ├── blankapp-0.0.1-alpha-javadoc.jar.sha1│?? │?? ├── blankapp-0.0.1-alpha-sources.jar│?? │?? ├── blankapp-0.0.1-alpha-sources.jar.md5│?? │?? ├── blankapp-0.0.1-alpha-sources.jar.sha1│?? │?? ├── blankapp-0.0.1-alpha.aar│?? │?? ├── blankapp-0.0.1-alpha.aar.md5│?? │?? ├── blankapp-0.0.1-alpha.aar.sha1│?? │?? ├── blankapp-0.0.1-alpha.pom│?? │?? ├── blankapp-0.0.1-alpha.pom.md5│?? │?? └── blankapp-0.0.1-alpha.pom.sha1│?? ├── maven-metadata.xml│?? ├── maven-metadata.xml.md5│?? └── maven-metadata.xml.sha1└── ...Push
$ git add . $ git commit -am "Add BlankApp Library" $ git push -u origin master到此,一個私人的Maven倉庫已經創建完成
如何使用 mvn-repo
1、只需將 mvn-repo 地址添加到您的 build.gradle 文件:
repositories {maven { url 'https://raw.githubusercontent.com/lijy91/mvn-repo/master/' }jcenter() }2、在要集成的項目中的 build.gradle 中添加依賴,如下:
dependencies {compile 'org.blankapp:blankapp:0.0.1-alpha@aar' }對于自己開發第三方庫的一些建議
盡量不依賴第三方庫
我最早寫的一個基礎框架庫,就引用了一些個人認為比較好用的 JSON 解析庫,ORM庫,后來應用在其他項目的時候發現有一些是在這個項目中是使用不到的,造成了耦合度過大,后面維護難度過大。所以建議盡量不要依賴,或者參考最后面兩個建議的做法。
ARTIFACT_ID 不要使用 library,sdk等名稱
如果 ArtifactId 使用的是 library,sdk 這種名字,編譯后生成的相關文件就會是 library.jar、sdk.jar 這種文件,不便于分辨。
例如 FIR.im 的 SDK
compile 'im.fir:sdk:latest.integration@aar'最終在 Android Studio 看到的 External Libraries 就會出現一個sdk.jar 的文件,如果你引用了多個 ArtifactId 為 library 的類庫,那就會出現 library.jar、library1.jar 這樣的文件,根本無法分辨。
后來在我的建議下修改為
compile 'im.fir:fir-sdk:latest.integration@aar'多模塊
以下是之前我對 Ping++ SDK 提的一些建議
將基礎部分封裝為一個sdk 模塊,并提供統一的接口,然后支付寶,微信支付,百度錢包等根據sdk模塊提供的接口進行開發,后面如果用戶需要接入或者升級支付平臺的內容,即可以通過在 build.gradle 文件添加相應平臺的依賴即可。
在 build.gradle 使用時類似這樣子
compile 'com.pingxx:pingxx-sdk:1.0.+' compile 'com.pingxx:pingxx-alipay:1.0.+' compile 'com.pingxx:pingxx-wxpay:1.0.+'避免引用后項目出現重復功能的庫
這個問題估計是大多數項目都有出現的問題,例如有我的項目使用了 Fastjson 作為我的JSON解析庫,但我使用的HTTP庫 Retrofit 1.x 卻使用 Gson,這個時候我的項目里就引用了兩個同樣功能的庫,而且在我們不注意的時候,包括HTTP庫,圖片加載庫等等都有可能會有重疊,會大大增加我們APK的大小。
后來Retrofit2解決了這個問題,它把數據轉換為獨立出來了,我們可以自由選擇自己的數據轉換庫,類似這樣
com.squareup.retrofit2:converter-gson // Gson com.squareup.retrofit2:converter-jackson // Jackson com.squareup.retrofit2:converter-moshi // Moshi com.squareup.retrofit2:converter-protobuf // Protobuf com.squareup.retrofit2:converter-wire // Wire com.squareup.retrofit2:converter-simplexml // Simple XML com.squareup.retrofit2:converter-scalars // Scalars (primitives, boxed, and String)Enjoy~
關于我
剛離職幾天,這段時間在整理近兩年的工作經驗,把自己一些經驗心得分享給大家,希望不斷的優化開發體驗,改進交付方式,將更多的時間花在學習以及生活上,也希望找一份為開發者服務的工作,坐標深圳。
4年工作經驗,近2年從事Android應用開發,熟悉從項目啟動到上線的完整流程,對產品及體驗有一定的理解,對Node.js及前端有著強烈的興趣,希望可以為優化開發體驗改進交付軟件交付方式出一點微薄之力~
總結
以上是生活随笔為你收集整理的巧用 GitHub 创建自己的私人 Maven 仓库,及一些开发Library的建议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 页面性能的基础因素 - 《Designi
- 下一篇: CloudFoundry Service