巧用 GitHub 建立本身的私人 Maven 倉庫,及一些開發Library的建議

因爲本人精力有限,若是內容有更新可能沒法及時更新其餘渠道的內容,請移步簡書 查看文章前端

2014年中的時候,當時國內使用 Android Studio 的人尚未不少,不少人還沒處理嚐鮮的時候我開始把公司的項目遷移到 Android Studio 上了,開始了挺長一段踩坑的日子,開始接觸到了 Gradle,纔開始瞭解到使用它來管理項目的依賴庫,因爲在過程當中有很多第三方庫是沒有將依賴包發佈到 jCenter / Maven Central ,並且我的並不太喜歡把一整個開源項目添加到項目中,致使常用一些非官方倉庫,從而可能給後續維護帶來一些問題。java

例如:git

  • 依賴庫可能有被作修改致使產生沒必要要的 Buggithub

  • 依賴庫被做者從倉庫中刪掉apache

  • 依賴庫更新不及時,升級依賴庫麻煩json

  • 後續跟進的開發者沒法得知依賴庫的來源bash

  • 等等一系統問題~微信

不地能夠經過如下兩個解決方案解決:app

  1. 給做者提 issues 讓做者將庫提交到 jCenter / Maven Central框架

  2. 本身 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.gradle

library 就是一個 Android Library 的Module,examples 是一個Demo Module。

使用 gradle-mvn-push 編譯腳本

使用了Chris Banes 大神開發的 gradle-mvn-push Gradle 腳本,Chris Banes大神是 Android-PullToRefreshPhotoView 等流行開源庫的做者。

在項目根目錄建立 gradle.properties 文件

COMPILE_SDK_VERSION=23
BUILD_TOOLS_VERSION=23.0.2
MIN_SDK_VERSION=14
TARGET_SDK_VERSION=23

VERSION_NAME=0.0.1-alpha
VERSION_CODE=1
GROUP=org.blankapp

POM_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_URLSNAPSHOT_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

一、只需將 mvn-repo 地址添加到您的 build.gradle 文件:

repositories {
    maven { url 'https://raw.githubusercontent.com/lijy91/mvn-repo/master/' }
    jcenter()
}

二、在要集成的項目中的 build.gradle 中添加依賴,以下:

dependencies {
    compile 'org.blankapp:blankapp:0.0.1-alpha@aar'
}

對於本身開發第三方庫的一些建議

儘可能不依賴第三方庫

我最先寫的一個基礎框架庫,就引用了一些我的認爲比較好用的 JSON 解析庫,ORM庫,後來應用在其餘項目的時候發現有一些是在這個項目中是使用不到的,形成了耦合度過大,後面維護難度過大。因此建議儘可能不要依賴,或者參考最後面兩個建議的作法。

ARTIFACT_ID 不要使用 librarysdk等名稱

若是 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.jarlibrary1.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及前端有着強烈的興趣,但願能夠爲優化開發體驗改進交付軟件交付方式出一點微薄之力~

聯繫我

相關文章
相關標籤/搜索