12 October 2017

[Android Dev Tips] เรียกใช้งาน Dependency ผ่าน Git แบบง่ายๆด้วย JitPack



        Android Developer หลายๆคนก็คงเคยผ่านตากับคำว่า JitPack กันมาบ้าง เพราะว่าเคยเรียกใช้ Library บางตัวที่ต้องกำหนด Repository URL ของ JitPack เพิ่มเข้าไปในไฟล์ build.gradle ซึ่งเจ้าของบล็อกได้ลองนั่งดูเล่นๆว่าเจ้า JitPack เนี่ยมันคืออะไรกันนะ? แล้วก็พบว่า "เฮ้ย ใช้มาตั้งนาน เพิ่งจะเข้าใจว่ามันคืออะไร"

        เนื่องจากบทความนี้เน้นไปที่ Android จึงขอพูดถึงการใช้งาน JitPack ใน Android Studio นะ

น่าจะรู้จักกับ Dependency กันแล้วเนอะ?

        คงจะไม่มี Android Developer คนไหนที่ไม่รู้จักและไม่เคยใช้ Dependency มาก่อน เพราะว่ามันเป็นหนึ่งในพื้นฐานสำคัญของการพัฒนาโปรแกรมในปัจจุบัน ที่นักพัฒนาไม่ได้เขียนโค้ดขึ้นมาเองทั้งหมด 100% แต่ว่าจะมีการหยิบใช้โค้ดหรือ Library จากนักพัฒนาคนอื่นๆมาใช้ในโปรเจคเพื่อให้งานเสร็จไวขึ้น

        ซึ่งในยุคนี้ก็มีความสะดวกสบายไปอีกขั้น เพราะเดี๋ยวนี้นักพัฒนาสามารถดึง Dependency จากอินเตอร์เน็ตมาใช้งานในโปรเจคได้เลย โดยที่แทบไม่ต้องทำอะไรนอกเหนือไปจากเพิ่มคำสั่งง่ายๆไว้ในโค้ดแบบนี้

// Gradle
implementation 'com.squareup.retrofit2:retrofit:2.3.0'

         โปรเจคตัวนี้ก็จะรู้ทันทีว่า "เฮ้ย ต้องใช้ Retrofit 2 ว่ะ" แล้วมันก็จะไปหาดาวน์โหลดมาให้จากอินเตอร์เน็ต เก็บไว้ในเครื่อง แล้วนักพัฒนาก็สามารถเรียกใช้งานได้ทันที

          ซึ่ง Dependency เหล่านี้จะถูกเก็บไว้ใน Repository ซึ่งอยู่ Server ที่ให้บริการอีกทีหนึ่ง โดยผู้ให้บริการที่คุ้นเคยและรู้จักกันเป็นอย่างดีก็จะมี Maven Central และ JCenter ซึ่งเจ้าเหล่านี้เป็น Public Repository ที่ให้นักพัฒนาทั่วโลกสามารถโยน Dependency ของตัวเองไปเก็บไว้บนนั้นได้ และก็จะมีพวก Private Repository ที่เก็บไว้ใน Server ส่วนตัวด้วย ยกตัวอย่างเช่น Official Library ของ Android

แล้วถ้าอยากมี Dependency เป็นของตัวเองล่ะ?

        ก็ไม่พ้นจะต้องไปสร้างบน Maven Central หรือว่า JCenter ซึ่งสามารถดูวิธีได้จาก

        • ขั้นตอนการ Upload Android Library ไปที่ Maven Central
        • วิธีการนำ Android Library ที่เขียนขึ้น jcenter และ Maven Central ผ่าน Android Studio ให้คนอื่นนำไปใช้งาน

        โดยจะมีขั้นตอนที่ต้องทำอยู่มากพอสมควร ถึงจะเอาขึ้นไปไว้บน Repository เหล่านั้นได้

        แต่วิธีที่น่าจะเหมากับนักพัฒนาทั่วๆไปที่ไม่ได้ต้องการ Publish ตัว Dependency ของตัวเองมากนัก แค่สร้างขึ้นมาไว้ใช้เองแบบง่ายๆ เจ้าของบล็อกขอแนะนำ...

เรียก Dependency จาก Git ด้วย JitPack

        โอเค เข้าเรื่องซะที! ถ้าผู้ที่หลงเข้ามาอ่านไม่อยากโยนขึ้น Maven Central หรือว่า JCenter เจ้าของบล็อกแนะนำให้โยนขึ้น Git ไว้ซักที่ (เช่น GitHub หรือ Bitbucket) แล้วใช้สิ่งที่เรียกว่า JitPack ครับ

        เพราะ JitPack จะทำ Git ให้กลายเป็น Repository แบบง่ายๆ โดยที่ไม่ต้องไปทำอะไรเพิ่มบน Git เลย เดี๋ยว JitPack มันจะไปดึงโปรเจคใน Git มา Build เป็น Dependency เพื่อให้เรียกใช้งานในโปรเจคอื่นๆได้ทันที


        นั่นหมายความว่า ถ้าอยากจะดึง Dependency จากใน Git ก็ให้ใช้ JitPack ได้เลยจ้า แต่มีเงื่อนไขว่าใน Repository นั้นๆจะต้องมี Library อยู่ด้วยจริงๆ ถ้าเป็นแค่ Project เฉยๆจะไม่สามารถเรียกใช้งานได้นะ

        ซึ่ง Project ที่มี LIbrary อยู่ด้วย ก็คือ Project ที่มี Module ใดๆก็ตามที่กำหนดไว้ใน build.gradle ว่า

apply plugin: 'com.android.library'

         เดี๋ยว JitPack มันก็จะรู้ได้เองแล้วดึงมาทำเป็น Dependency ให้โดยอัตโนมัติ

JitPack มันใช้งานยังไง?

        ก่อนอื่นให้เปิด build.gradle ของ Project ขึ้นมา แล้วเพิ่ม JitPack เข้าไปใน Repository ซะ

// build.gradle (Project)

...
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
...

        สมมติว่าเจ้าของบล็อกมี Library ที่ตัวเองเขียนขึ้นมาโดยเก็บไว้ใน GitHub แล้วอยากจะเรียกมาใช้งาน จะต้องเรียกผ่านรูปแบบดังนี้

...
dependencies {
    ...
    compile 'com.github.{User}:{Repository}:{Version}'
}

        • User : ชื่อ User เจ้าของ Repository นั้นๆ
        • Repository : ชื่อ Repository ที่อยู่บน Git นั้นๆ
        • Version : กำหนด Commit hash หรือ Tag ที่ต้องการ

        ขอยกตัวอย่างเป็น Localization Activity [GitHub]



        สมมติว่าอยากจะดึงจาก Commit Hash ที่ 90b181... ก็จะต้องกำหนดเป็นแบบนี้

...
dependencies {
    ...
    compile 'com.github.akexorcist:Android-LocalizationActivity:90b1b8161943405d5db693fc7f8eea6b7f6cfc45'
}

        เดี๋ยว JitPack ก็จะไปดึง Repository ของเจ้าของบล็อกมา Build เป็น Dependency ให้ โดยใช้ชุดโค้ดที่ Commit Hash 90b1b81... มาใช้

        และนอกจากการกำหนดด้วย Commit Hash แล้ว ยังสามารถกำหนดเป็น Tag ได้ด้วย หรือจะกำหนดเป็น -SNAPSHOT เพื่อดึงข้อมูลล่าสุดมา Build เป็น Dependency

...
dependencies {
    ...
    compile 'com.github.akexorcist:Android-LocalizationActivity:-SNAPSHOT'
}

        สำหรับ -SNAPSHOT สามารถกำหนดชื่อ Branch ได้ว่าจะเอาอันล่าสุดของ Branch ไหน โดยใส่ชื่อ Branch นำหน้าคำว่า -SNAPSHOT ได้เลย

...
dependencies {
    ...
    compile 'com.github.akexorcist:Android-LocalizationActivity:develop-SNAPSHOT'
}

        เพียงเท่านี้ก็สามารถใช้คำสั่งจาก Library ที่ทำเก็บไว้ใน GitHub ได้แล้ว


ไม่ได้รองรับแค่ GitHub เท่านั้นนะ!

        อยากจะให้ JitPack ดึงมาจากที่ไหนก็กำหนดได้ตามใจชอบเลย

// GitHub
com.github.{User}:{Repository}:{Version}

// Bitbucket
org.bitbucket.{User}:{Repository}:{Version}

// GitLab
com.gitlab.{User}:{Repository}:{Version}

        ถ้าเป็น Server ของตัวเองสามารถดูรายละเอียดเพิ่มเติมได้ที่ Custom domain name [JitPack]

        และถ้าเป็น Private Repository ของตัวเองบน GitHub สามารถใช้ Access Token ของ GitHub เพื่อให้ JitPack ดึงมา Build เป็น Dependency ได้เหมือนกัน แต่รองรับเฉพาะ GitHub เท่านั้น ดูรายละเอียดเพิ่มเติมได้ที่ Private Repositories [JitPack]

สรุป

        จริงๆแล้ว  JitPack ยังทำอะไรได้อีกเยอะพอสมควร แต่หลักๆก็จะเป็นการใช้ JitPack ช่วยดึงโค้ดจาก Git มาทำเป็น Dependency เพื่อให้สามารถเรียกใช้งานจากในโปรเจคได้เลย ซึ่งจะเหมาะกับนักพัฒนาหลายๆคนที่สร้าง Library แบบง่ายๆไว้เป็นของตัวเองแล้วต้องการเรียกใช้งานในโปรเจคอื่นๆ โดยที่ไม่อยากจะเสียเวลาไปนั่ง Publish ขึ้น Maven Central หรือ JCenter ที่ต้องมีขั้นตอนต่างๆมากมาย




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium