آپلود کردن لایبرری اندروید در bintray با گریدل

یه بخش از پروژم رو تبدیل کردم به یه ماژول که از کد ماژول اصلی جدا بشه و بعدا هم بتونم ازش تو پروژه‌های دیگه استفاده کنم. با خودم گفتم چرا تبدیلش نکنم به لایبرری و نذارمش توی Bintray که بعدا مثل کتابخونه‌های عادی به برنامه‌ام اضافه کنمش؟

چنتا مقاله و داکیومنت رو خوندم اما هر کدوم یه جور نقص داشتن و یه مدل ارور داشتن. دنبال یه منبع بودم که خلاصه و مفید کارم رو راه بندازه و کتابخونه‌ام رو آپلودش کنم. از ترکیب چیزایی که خوندم تونستم بالاخره این کار رو انجام بدم. تو این مقاله نحوه‌ی انجام کارم رو توضیح می‌دم.


قدم اول: حساب Bintray

باید اول توی سایت Bintray حساب بسازید و وارد شید.

بعد از اینکه وارد شدید یه سازمان (Organization) بسازید.

ساخت organization
ساخت organization

بعدش روی سازمانی که ساختید کلیک کنید و یه مخزن (Repository) بسازید.

ساخت repository
ساخت repository

بعد از وارد کردن نام مخزن،‌‌‌ Type اون رو Maven قرار بدید، چون قراره کتابخونه برای اندروید باشه.

برای مثال من اسم سازمان رو mah-d انتخاب کردم و اسم مخزن رو maven. اینا رو باید حواسمون باشه، چون باهاشون کار داریم.

حالا باید یه پکیج بسازیم توی مخزن. روی مخزن کلیک کنید و Add New Package رو انتخاب کنید.

ساخت پکیج
ساخت پکیج

اطلاعات وارد شده مختص کتابخونه‌ی شماست و اطلاعاتی که من توی عکس گذاشتم صرفا مثال هست.

تا اینجا کارهای مربوط سایت تموم شده و بهتره بریم سراغ اندروید استودیو.


قدم دوم: راه‌اندازی اندروید استودیو

این دو خط رو به بلاک dependencies مربوط به فایل پروژه (و نه ماژول‌ها) اضافه کنید:


classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'

برای راحتی کار کل کد‌هایی که قراره اضافه‌کنیم رو توی یه فایل میذاریم و ماژولی که قراره آپلود بشه از این فایل استفاده خواهد کرد. پس کنار فایل گریدل پروژه (و دوباره، ماژول نه) یک فایل می‌سازیم به اسم bintray.gradle و کدهای زیر رو به ترتیب داخلش قرار می‌دیم.

دو تا پلاگین رو اول توی فایل فعال می‌کنیم:

apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

بعد متغیرهای لازم رو می‌سازیم (برای اینکه متغیر‌ها همه‌جا قابل استفاده باشن اونا رو توی بلاک ext می‌ذاریم).

ext {
    bintrayRepo = 'maven' // نام مخزن
    bintrayName = 'pulp' // نام پکیج
    // publishedGroupId:artifact:libraryVersion
    publishedGroupId = 'ir.malv.utils' // پکیج‌نیم لایبرری
    artifact = 'pulp' // اسم ماژول
    libraryVersion = '0.0.1' // نسخه
    libraryName = 'Pulp' // عنوان لایبرری
    libraryDescription = 'Simple logger' // توضیح برای لایبریی
    siteUrl = 'https://github.com/mahdi-malv' // لینک سایت
    gitUrl = 'https://github.com/mahdi-malv/pulp.git' // لینک گیت
    developerId = 'mahdi-malv' // آی‌دی توسعه‌دهنده
    developerName = 'Mahdi Malvandi' // اسم توسعه‌دهنده
    developerEmail = 'email@gmail.com' // ایمیل
    licenseName = 'The Apache Software License, Version 2.0' // عنوان لایسنس
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' // لینک لایسنس
    allLicenses = ["Apache-2.0"] // همه‌ی لایسنس‌ها
}

نام مخرن: مخزنی که در ابتدا ساختید.

نام پکیج: پکیجی که برای اون مخزن ساختید.

پکیج‌نیم لایبرری: پکیج‌نیمی که ماژول داره (همون application id)

اسم ماژول: تو منوی projects اندروید استودیو و فایل settings.gradle ماژول عنوانی داره که منظور همونه.

نسخه‌: نسخه‌ای که ماژول داره.

عنوان: به دلخواه یه نام برای کتابخونه. مثلا همون اسم ماژول.

لینک‌ها: برای لایبرری یک ریپوی گیت بسازید و اون رو برای issues، گیت استفاده کنید، برای سایت هم می‌تونید سایت خودتون رو بذارید اگر دارید، اگر هم نه مثل اینجا صرفا لینک حساب گیت‌هاب رو بذارید.

لایسنس‌ها: در مورد لایسنس‌ها اینجا بیشتر بخونید:

https://opensource.org/licenses

با این متغیرها کد گریدل لایبرری شما بدین صورت خواهد بود:

publishedGroupId:artifact:libraryVersion`

ir.malv.utils:pulp:0.0.1

بعد از اینکه این متغیر‌ها درست تنظیم‌شدن، کد‌های زیر رو اضافه کنید.

group = publishedGroupId
version = libraryVersion

install {
    repositories.mavenInstaller {
        pom.project {
            packaging 'aar'
            groupId publishedGroupId
            artifactId artifact
            name libraryName
            description libraryDescription
            url siteUrl
            licenses {
                license {
                    name licenseName
                    url licenseUrl
                }
            }
            developers {
                developer {
                    id developerId
                    name developerName
                    email developerEmail
                }
            }
            scm {
                connection gitUrl
                developerConnection gitUrl
                url siteUrl
            }
        }
    }
}
task sourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
task javadoc(type: Javadoc) {
   source = android.sourceSets.main.java.srcDirs
   classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
artifacts {
    archives javadocJar
    archives sourcesJar
}

و حالا این کدها رو اضافه کنید که کانفیگ لایبرری در Bintray هست.

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = bintrayRepo
        name = bintrayName
        desc = libraryDescription
        userOrg = 'mah-d'
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = allLicenses
        dryRun = false
        publish = true
        override = false
        publicDownloadNumbers = true
        version {
            desc = libraryDescription
        }
    }
}

توی این بلاک چنتا فیلد مهم هست. یکی userOrg که همون سازمان (Organization) هست که در ابتدای قدم اول ساختید.

فیلدهای user و key:

برای ارتباط با Bintray یک نام‌کاربری لازمه و یک ApiKey. نام کاربری که مشخصه، اما ApiKey رو باید از سایت بردارید. روی پروفایل کلیک کنید و Edit profile رو بزنید و مطابق تصویر ApiKey رو کپی کنید.

گرفتن API key
گرفتن API key

توی فایل local.properties دوتا فیلد اضافه کنید:

bintray.user=userName
bintray.apikey=apiKey

!:‌دقت کنید که مقدارها رو توی double quote یا single quote نذارید.

دلیل قراردادن این مقدارها توی این فایل اینه که چون حساس و مهم هستن بهتره بیان توی فایلی که توی .gitignore هست و توی گیت پوش نمی‌شه.

کار فایل bintray.gradle تموم‌شده و حالا کافیه که به فایل گریدل ماژول اضافه کنیم و گریدل رو سینک کنیم:

این کد رو به انتهای فایل build.gradle (مربوط به ماژول) اضافه کنید:

apply from: '../bintray.gradle'

این یعنی فایل توی یک فولدر بالاتر از محل کنونیه (اگر فایل رو جای دیگه‌ای گذاشتید، آدرس درست رو قرار بدید).

بعد از سینک کردن باید تسک‌های clean و install رو ران کنید. دوبار کلید Ctrl رو بزنید و کامند زیر رو وارد کنید و Enter رو بزنید. دقت کنید که عملیات موفقیت‌آمیز باشه و اگر خطا داشتید ابتدا خطا رو رفع کنید بعد دوباره کامند رو ران کنید.

gradle clean install

همچنین می‌تونید توی ترمینال یا CMD هم این کار رو انجام بدید.

# Cmd

gradle.bat clean install

# Terminal

./gradlew clean install

بعد از اون تسک bintrayUpload رو باید ران کنید. از منوی تسک‌های ماژول بخش publishing می‌تونید اون رو انتخاب کنید.

بعد از اتمام اجرا، مطمئن شید که تسک موفقیت‌آمیز بوده. بعد می‌تونید برید به سایت و بعد از رفرش ببینید که فایل‌های جدید اضافه‌شدن.

الآن می‌تونید از همین طریق با url لایبرری رو به یک پروژه‌ی اندروید اضافه کنید:

توی صفحه‌ی پکیج، لینکی که به لایبرری اشاره داره رو باید به repositories اضافه‌کنید.

لینک مخزن که پکیج توی اون قرار داره
لینک مخزن که پکیج توی اون قرار داره

repositories {
    google()
    jcenter()
    maven { url 'https://dl.bintray.com/mah-d/maven' }
}

و بعد توی dependencies کد لایبرری رو اضافه‌کنید:

کد dependency لایبرری
کد dependency لایبرری

هم‌چنین در صورتی که لایبرری مناسب ‌Jcenter (مخزن اصلی که توی اندروید به طور پیش‌فرض اضافه‌می‌شه) هست می‌تونید اون رو به Jcenter اضافه کنید. با این کار نیاز به اضافه‌کردن لینک مخزن نیست.

گیت‌هاب لایبرری و همه‌ی این کدها رو هم می‌تونید اینجا پیدا کنید.

لینک مقاله‌های مفید و مرتبط:

Simple way to publish your library to Jcenter

Bintray gradle plugin

Publishing to bintray with gradle