เป็นไปได้หรือไม่ที่จะประกาศที่เก็บ git เป็นการพึ่งพาใน android gradle?


113

ฉันต้องการใช้ lib เวอร์ชันหลักจาก mavencentral

เป็นไปได้หรือไม่ที่จะประกาศที่เก็บ git เป็นการพึ่งพาใน android gradle?


3
คุณพบวิธีแก้ปัญหาหรือไม่?
Sahir Saiyed

คำตอบ:


150

สำหรับฉันวิธีที่ดีที่สุดคือ:

https://jitpack.io

ขั้นตอนที่ 1. เพิ่มที่เก็บ JitPack ใน build.gradle ที่ส่วนท้ายของที่เก็บ:

repositories {
    // ...
    maven { url "https://jitpack.io" }
}

ขั้นตอนที่ 2. เพิ่มการอ้างอิงในแบบฟอร์ม

dependencies {
    compile 'com.github.User:Repo:Tag'
}

เป็นไปได้ที่จะสร้างคอมมิตล่าสุดบนสาขาหลักตัวอย่างเช่น:

dependencies {
    compile 'com.github.jitpack:gradle-simple:master-SNAPSHOT'
}

6
หากคุณต้องการต้นแบบล่าสุดให้ใช้รุ่น-SNAPSHOT jitpack.io/docs/#snapshots
Andrejs

5
นี่คือสแปมฉันเดา แต่อยากจะบอกว่าjitpack.ioเจ๋งจริงๆ ..............
Eric

5
ตรวจสอบให้แน่ใจว่าคุณวางสิ่งนี้ไว้ในส่วนหลักไม่ใช่buildscript
Sergei Ledvanov

"TAG" คืออะไร ??
Makalele

@ Makalele "TAG" คือแท็ก git (คอมมิตที่ติดแท็กเช่นบางรุ่น) เอกสาร
แดด

40

หรือคุณสามารถลงทะเบียนที่เก็บเป็นโมดูลย่อยเช่นนี้

$ git submodule add my_sub_project_git_url my-sub-project

จากนั้นรวมโปรเจ็กต์ไว้ในไฟล์ settings.gradle ของคุณซึ่งควรมีลักษณะดังนี้

include ':my-app', ':my-sub-project'

สุดท้ายรวบรวมโปรเจ็กต์เป็นการพึ่งพาในไฟล์ build.gradle ของแอปพลิเคชันของคุณเช่นนี้

dependencies {
  compile project(':my-sub-project')
}

จากนั้นเมื่อทำการโคลนโปรเจ็กต์ของคุณคุณจะต้องเพิ่มอ็อพชัน--recursiveเพื่อทำให้ git โคลนที่เก็บรูทโดยอัตโนมัติและโมดูลย่อยทั้งหมด

git clone --recursive my_sub_project_git_url

ฉันหวังว่ามันจะช่วยได้


ปกติฉันไม่ได้เขียนสิ่งนี้ในความคิดเห็น แต่ในกรณีนี้ฉันต้องพูดว่า "Holy shit, dude! เยี่ยมมากขอบคุณมาก!" :-)
L Butz

ฉันเห็นด้วยกับ @MisterSmith Git submodules มักจะกลับมากัดคุณและคนอื่น ๆ ..
AO_

13

ตอนนี้มีฟีเจอร์ใหม่ใน gradle ที่ให้คุณเพิ่ม source dependencies จาก git

ก่อนอื่นคุณต้องกำหนด repo ในsettings.gradleไฟล์และแมปกับตัวระบุโมดูล:

sourceControl {
    gitRepository("https://github.com/gradle/native-samples-cpp-library.git") {
        producesModule("org.gradle.cpp-samples:utilities")
    }
}

และในตอนนี้build.gradleคุณสามารถชี้ไปที่แท็กเฉพาะ (เช่น: 'v1.0'):

dependencies {
    ...

    implementation 'org.gradle.cpp-samples:utilities:v1.0'
}

หรือสาขาเฉพาะ:

dependencies {
    ...

    implementation('org.gradle.cpp-samples:utilities') {
        version {
            branch = 'release'
        }
    }
}

ข้อควรระวัง:

  • ต้องใช้ Gradle 4.10 หรือสูงกว่า
  • ยังไม่รองรับการตรวจสอบสิทธิ์

อ้างอิง:


จะดีมากถ้าสิ่งนี้สามารถใช้ได้กับ IDE: ฉันลองใช้ sourceControl สำหรับหนึ่งในไลบรารีของฉันในโปรเจ็กต์ Android ของฉัน (กับ Android Studio 3.4.1) IDE ไม่สามารถทำ "gradle sync" และซอร์สไฟล์ได้ ไม่เห็นไลบรารี… .. แต่ถ้าฉันสร้างผ่านบรรทัดคำสั่งโดยใช้ "./gradlew build" ทุกอย่างจะทำงาน
gabry

ฉันไม่แน่ใจว่าเป็นแค่ฉัน แต่ฉันประสบปัญหามากมายเกี่ยวกับเรื่องนี้โดยเฉพาะเมื่อห้องสมุดมีการเชื่อมโยงฐานข้อมูล สำหรับสคริปต์ gradle จะพ่น NPE และไม่สามารถค้นหาโฟลเดอร์ sdk สำหรับคอมไพเลอร์ databinding ในขณะที่สร้าง git repo โดยอัตโนมัติ android.googlesource.com/platform/tools/base/+/…ในที่สุด ฉันก็ต้องยอมรับ local.properties ของฉันอย่างไรก็ตามฉันพบปัญหาอื่น ๆ เช่นกัน
humblerookie

6

ฉันไม่คิดว่า Gradle สนับสนุนการเพิ่มที่เก็บ git เป็นการอ้างอิง วิธีแก้ปัญหาของฉันคือ:

  • ประกาศว่าโปรเจ็กต์หลักขึ้นอยู่กับโปรเจ็กต์อื่นในระบบไฟล์
  • ให้วิธีการโคลน repo git โดยอัตโนมัติในโฟลเดอร์ที่ประกาศว่าเป็นการอ้างอิง

ฉันคิดว่าคุณต้องการ repo ไลบรารีนอกโฟลเดอร์ของ repo โปรเจ็กต์หลักดังนั้นแต่ละโปรเจ็กต์จะเป็น git repos ที่เป็นอิสระและคุณสามารถคอมมิตกับไลบรารีและที่เก็บ git หลักของโปรเจ็กต์ได้อย่างอิสระ

สมมติว่าคุณต้องการให้โฟลเดอร์ของโครงการไลบรารีอยู่ในโฟลเดอร์เดียวกับโฟลเดอร์ของโครงการหลัก

คุณสามารถ:

ใน settings.gradle ระดับบนสุดให้ประกาศที่เก็บไลบรารีเป็นโปรเจ็กต์โดยระบุตำแหน่งในระบบไฟล์

// Reference:  https://looksok.wordpress.com/2014/07/12/compile-gradle-project-with-another-project-as-a-dependency/

include ':lib_project'
project( ':lib_project' ).projectDir = new File(settingsDir, '../library' )

ใช้ปลั๊กอิน gradle-gitเพื่อโคลนไลบรารีจากที่เก็บ git

    import org.ajoberstar.gradle.git.tasks.*

    buildscript {
       repositories { mavenCentral() }
       dependencies { classpath 'org.ajoberstar:gradle-git:0.2.3' }
    }

    task cloneLibraryGitRepo(type: GitClone) {
            def destination = file("../library")
            uri = "https://github.com/blabla/library.git"
            destinationPath = destination
            bare = false
            enabled = !destination.exists() //to clone only once
        }

ในการอ้างอิงของโปรเจ็กต์ของคุณให้บอกว่าโค้ดของโปรเจ็กต์ของคุณขึ้นอยู่กับโฟลเดอร์ของโปรเจ็กต์คอมไพล์

dependencies {
    compile project(':lib_project')
}

ตอนนี้ Gradle รองรับการอ้างอิงแหล่งที่มาพร้อมข้อ จำกัด บางประการ ดูคำตอบของฉันที่นี่
Mister Smith

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.