Android studio เพิ่มโครงการภายนอกเพื่อ build.gradle


140

ฉันมีโครงการตัวอย่างโดยมีการตั้งค่าต่อไปนี้:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

ที่ ' โครงการทดสอบ ' ขึ้นอยู่กับ ' ทดสอบ Lib ' และสุดท้ายขึ้นอยู่กับ ' Pure Java Lib ' รวบรวมโครงการและเปิดใช้งานการตั้งค่านี้ได้ดี

ตอนนี้ฉันกำลังคิดที่จะนำเข้าพื้นที่ทำงาน Eclipse ก่อนหน้าของฉันและทำงานกับ Android studio ปัญหาคือการตั้งค่าโครงการแตกต่างกันและฉันต้องการให้มันเป็นแบบนี้

ตัวอย่างเช่นหากใช้ตัวอย่างก่อนหน้านี้:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

ฉันลองการกำหนดค่าหลายอย่างแล้ว แต่ฉันไม่พบวิธีการอ้างอิงโครงการนอกขอบเขตของโฟลเดอร์หลัก (' รูท ' ในกรณีตัวอย่าง)

ในหลายแพลตฟอร์ม / โมดูลคุณสามารถใช้ '.. ' เพื่อเลื่อนขึ้นในโฟลเดอร์ แต่สิ่งนี้ไม่ได้ผลสำหรับฉันบางทีฉันอาจใช้ผิด

ไม่มีใครรู้ว่าสิ่งนี้สามารถทำได้ด้วย Gradle?

UPDATE

ฉันจะพยายามที่จะเป็นแบบทั่วไปมากขึ้น:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

ผมอยากจะใช้โมดูล 1 ของโครงการ B , ในโครงการ


อัปเดต: 09-03-19

ฉันเห็นสิ่งนี้ในตอนนี้และฉันต้องอัปเดต ... หลังจากผ่านไปเกือบ 6 ปีแล้ววันนี้ฉันฉลาดและฉันสามารถพูดได้อย่างแน่นอนว่าปัญหาคือฉันเข้าใจผิดแนวคิดของ "ที่มาของความจริง"

ในขณะที่การอ้างอิงห้องสมุดหนึ่งเป็นสิ่งที่ดีที่จะมีแนวคิด .. และอาจดูเหมือน "แหล่งที่มาของความจริง" ที่ "แหล่งที่มาของความจริง" REAL "จะเป็นรุ่นของรหัสที่แต่ละโครงการใช้ห้องสมุดของสาเหตุ ไลบรารี่เองนั้นมีหลายเวอร์ชั่น .. หลายเวอร์ชั่น "แหล่งที่มาของความจริง" นั้นสัมพันธ์กับโครงการที่ใช้ไลบรารี

วิธีที่ถูกต้องคือการใช้สิ่งที่นักพัฒนาส่วนใหญ่ไม่ชอบและนั่นคือ submodules คอมไพล์และใช่แหล่งที่มาที่ซ้ำกันในแต่ละโครงการทำให้เกิดโอกาสมากที่สุดที่แต่ละโครงการจะใช้รหัสรุ่นที่แตกต่างกัน

อย่างไรก็ตามคุณจะต้องตั้งเป้าหมายให้ทุกโครงการของคุณใช้ไลบรารี่รุ่นล่าสุดและยิ่งใหญ่ที่สุดของคุณ .. ซึ่งเป็นความท้าทายด้วยตัวมันเอง

เหตุผลนี้เป็นวิธีที่ถูกต้องในการพัฒนาโครงการที่มีแหล่งที่มาของไลบรารีเพราะขนาดนี้ ... คุณสามารถมีหลายร้อยโครงการในแต่ละโครงการที่มีการกำหนดค่าห้องสมุดของตัวเอง


4
ฉันเห็นคำถามนี้ได้รับความสนใจ ... หลังจากพยายามอย่างหนักจริง ๆ ฉันเลิกใช้งานสตูดิโอ Android ในตอนนี้เนื่องจากความซับซ้อนของการตั้งค่าที่ฉันพยายามจะสร้างนั้นมากเกินไปและการสร้างโครงการสุดท้ายของฉันทำได้ แต่มีความไม่แน่นอนสูง ด้วยการเปิดตัวสตูดิโอ Android ทุกครั้งฉันต้องตั้งค่าพารามิเตอร์อีกครั้งและทำให้การสร้างทำงานด้วยตนเอง ประมาณสองเดือนแล้วตั้งแต่ฉันยอมแพ้และฉันหวังว่าทุกอย่างจะดีขึ้นแล้ว!
TacB0sS

วิธีที่ 2 ที่นี่อธิบายวิธีการทำสิ่งนี้ได้อย่างง่ายดายมาก: stackoverflow.com/questions/25610727/…
Doron Ben-Ari

คำตอบ:


222

สมมติว่าโฟลเดอร์อื่น ๆ บางโครงการเป็นโครงการไล่ระดับคุณสามารถเพิ่มสิ่งต่อไปนี้ในไฟล์ settings.gradle

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
จุด someOtherFolder ไปยังโฟลเดอร์โครงการและในนั้นมีโมดูลที่ฉันสนใจเพิ่มเป็นโมดูลเพื่อโครงการ Android Lib
TacB0sS

การตั้งค่า dir ชี้ไปที่ 'root' ฉันต้องการระดับที่สูงขึ้นไปยังโมดูลอื่นในโครงการอื่น
TacB0sS

คุณสามารถเพิ่ม submodules หลังจากนั้นได้หรือไม่ รวม ': someOtherFolder: proj1'
อีธาน

1
อัปเดตพร้อมรายละเอียดบางอย่าง settings.gradle ควรอยู่ใน / โครงการ A
Ethan

5
คำตอบที่ดี ใน AS 1.0.2 ฉันต้องทำสิ่งต่อไปนี้: คลิกขวาที่โมดูล -> เปิดการตั้งค่าโมดูล -> การพึ่งพา -> + (ด้านล่าง) เลือกการพึ่งพาโมดูลเลือกไลบรารีของคุณจากรายการคลิกตกลง :)
T. Coutlakis

49

คุณต้องใส่ไฟล์settings.gradleบรรทัดนี้:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

จากนั้นคุณต้องเพิ่มในbuilde.gradleของคุณ(โมดูล: แอพ)ในแผนผังการพึ่งพาบรรทัดนี้:

implementation project(':module2')

หรือไปที่โครงสร้างโครงการ > แอป > การพึ่งพาคลิกที่เพิ่มเลือก3 การพึ่งพาโมดูลและเลือกโมดูลของคุณ


1
หากคุณมีปัญหาในการอ้างอิงคลาสของไลบรารีจากแอพหลักอาจเป็นเพราะไลบรารีอาจมีหลายรูปแบบ ดังนั้นเพียงแค่ระบุการพึ่งพาในวิธีที่เหมาะสม: compile project(path: ':library', configuration: 'variant'). ที่นี่variantประกอบด้วยflavorและbuildTypeตามที่กำหนดโดยbuild.gradleไฟล์ของห้องสมุด ตัวอย่างเช่นถ้าคุณต้องการreleaseสร้างประเภทของห้องสมุดในส่วนdevelopรสชาตินั้นคือvariant developRelease
Sevastyan Savanyuk

9

ด้วย Gradle 1.10 (ไม่ทราบว่ารุ่นอื่น ๆ นี้จะเป็นที่ถูกต้องสำหรับ) นี่คือสิ่งที่ฉันมาด้วยขึ้นอยู่กับการตอบสนองให้ที่นี่http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

ฉันมีโครงการห้องสมุด api โครงการห้องสมุดทั่วไปและโครงการแอปหลัก แต่ละคนเป็นโครงการพัฒนาแบบสแตนด์อโลนและทั้งสองไลบรารีนั้นมีไว้เพื่อแบ่งปันระหว่างแอพหลายตัว

ใน settings.gradle สำหรับโครงการทั่วไป:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

จากนั้นในการตั้งค่าโครงการหลักของแอป

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

ในแต่ละไฟล์ build.gradle ที่เกี่ยวข้องคุณเพียงแค่อ้างอิงพวกเขาด้วยชื่อที่คุณให้ไว้ใน settings.createProjectDescriptor เช่นเดียวกับการพึ่งพาโครงการอื่น ๆ :

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

ดูเหมือนว่าจะใช้งานได้ มันไม่ได้เกิดข้อผิดพลาดสำหรับไฟล์ DEX หลายไฟล์ที่กำหนดไลบรารี api ฉันสงสัยเพราะมันเป็นส่วนหนึ่งของกระบวนการสร้างเดียวกันทั้งหมดและ Gradle ฉลาดพอที่จะคิดได้ทั้งหมด


2
ฉันพยายามต่อไป แต่ปัญหาคือว่าการอ้างอิงในไลบรารีที่เกี่ยวข้องดูเหมือนจะไม่เคยโหลด ดังนั้นถ้าฉันเปิดห้องสมุดดูเหมือนว่าจะสบายดี แต่เมื่อฉันลองจากแอพหลักมันจะบอกว่าไลบรารีที่นำเข้าทั้งหมดหายไป
Czechnology

@ เทคโนโลยีมีปัญหาเดียวกัน แก้ไขมัน ดูความคิดเห็นของฉันสำหรับคำตอบนี้: stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk

9

คลิกขวาที่โครงการ - เลือก "เปิดการตั้งค่าโมดูล" - เลือก "โมดูล" ในบานหน้าต่างด้านซ้าย - คลิกที่สัญลักษณ์ "+" ที่ด้านบน - เลือก "นำเข้าโมดูล"

หลังจากนำเข้าโมดูล คุณต้องเพิ่มมันเป็นการอ้างอิงสำหรับโครงการปัจจุบันของคุณ

เลือก "โมดูล" ไว้ในบานหน้าต่างด้านซ้ายและคลิกที่โครงการของคุณ - ตอนนี้ไปที่แท็บการพึ่งพาและคลิกที่สัญลักษณ์ "+" ที่อยู่ด้านล่าง - เลือกตัวเลือกที่สาม "การพึ่งพาโมดูล" และถ้าคุณนำเข้าโครงการของคุณอย่างถูกต้อง แสดงให้คุณเห็นโมดูลที่มีอยู่ทั้งหมดที่สามารถเพิ่มเป็นการพึ่งพาโครงการปัจจุบันของคุณ


เกือบจะทำงาน ... โครงการไม่สามารถสร้างได้เนื่องจากผลลัพธ์ของโมดูลการพึ่งพาไม่ได้ถูกเพิ่มลงในไฟล์ build.gradle ซึ่งเป็นปัญหาดั้งเดิมของฉัน
TacB0sS

ฉันคิดว่าด้วย gradle คุณต้องใส่โปรเจคทั้งหมดลงในโฟลเดอร์ root เดียวกัน ลองดู ใส่โครงการที่คุณต้องการเพิ่มเป็นการอ้างอิงในโฟลเดอร์เดียวกับโครงการปัจจุบันของคุณ
Varundroid

นี่คือสิ่งที่ไม่มีใครต้องการทำนอกจาก ATM หากคุณต้องการทำงานกับ Android Studio นี่คือวิธีที่จะทำให้สิ่งต่าง ๆ ทำงานได้ อีกทางเลือกหนึ่งที่ฉันติดตามคือฉันสร้างโครงการใน Intellij การตั้งค่าการอ้างอิงทั้งหมดแล้วนำเข้าโครงการนั้นไปยังสตูดิโอ Android โดยทำสิ่งนี้ฉันบังคับให้ Android Studio ใช้ระบบสร้างมดมากกว่า Gradle หวังว่ามันจะช่วย ไชโย !!
Varundroid

1
@Varundroid การแก้ปัญหาคือการนำเข้าการอ้างอิงไปยังไลบรารีแบบเอกเทศโดยใช้คำตอบของ Ethan จากนั้นเพิ่มโมดูลลงในการอ้างอิงของแอปหลักโดยใช้คำตอบของคุณ สิ่งนี้ช่วยให้คุณสามารถอ้างอิงไลบรารีเดียวกันในหลาย ๆ แอพโดยไม่ต้องทำซ้ำรหัสห้องสมุด
bcorso

1

ฉันถามคำถามนี้อีกครั้งในลักษณะที่สื่อถึงความตั้งใจของผู้โพสต์ดั้งเดิมที่เราจะอ้างอิงไลบรารี Android และ Java แบบกำหนดเองที่อาศัยอยู่นอกไดเรกทอรีของโครงการ Android หลักของเราได้อย่างไร

ที่นั่นฉันตอบคำถามของฉันเอง ที่สำคัญคำตอบของฉันใช้ @ อีธาน (ผู้เขียนคำตอบที่เลือกในหัวข้อปัจจุบัน) ความเข้าใจด้านการเขียนโค้ดแบบไล่ระดับ แต่คำตอบของฉันยังนำทาง gotchas อื่น ๆ และให้รายละเอียดตัวอย่างทีละขั้นตอน


-1

อย่างที่อีธานกล่าวถ้าคุณเพิ่มสิ่งนี้ลงใน settings.gradle มันจะเพิ่มโครงการภายนอกไปยัง Android Studio (ในตัวอย่างนี้มันอยู่ในโฟลเดอร์พาเรนต์):

project(':../ProjectB/:module1')

จากนั้นเมื่อต้องการเพิ่มเป็นการอ้างอิงของหนึ่งในโครงการของคุณเพียงเพิ่มใน build.gradle ของโครงการนั้นเป็นการพึ่งพาอื่นเช่นนี้ (คุณสามารถทำกราฟิกได้เช่นเดียวกับที่นี่ ):

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