คำตอบนี้จะแสดงให้เห็นถึงความแตกต่างระหว่างimplementation
, api
และcompile
ในโครงการ
สมมติว่าฉันมีโครงการที่มีโมดูล Gradle สามโมดูล:
- แอพ (แอปพลิเคชัน Android)
- myandroidlibrary (ห้องสมุด Android)
- myjavalibrary (ไลบรารี Java)
app
มีการmyandroidlibrary
พึ่งพา myandroidlibrary
มีการmyjavalibrary
พึ่งพา
myjavalibrary
มีMySecret
ชั้นเรียน
public class MySecret {
public static String getSecret() {
return "Money";
}
}
myandroidlibrary
มีMyAndroidComponent
คลาสที่จัดการค่าจากMySecret
คลาส
public class MyAndroidComponent {
private static String component = MySecret.getSecret();
public static String getComponent() {
return "My component: " + component;
}
}
สุดท้ายapp
นี้สนใจเพียงคุณค่าจากmyandroidlibrary
TextView tvHelloWorld = findViewById(R.id.tv_hello_world);
tvHelloWorld.setText(MyAndroidComponent.getComponent());
ทีนี้มาพูดถึงการพึ่งพา ...
app
จำเป็นที่จะต้องใช้:myandroidlibrary
ดังนั้นในการใช้งานapp
build.gradleimplementation
( หมายเหตุ : คุณสามารถใช้ API / คอมไพล์ได้เช่นกัน แต่ถือความคิดชั่วครู่หนึ่ง)
dependencies {
implementation project(':myandroidlibrary')
}
คุณคิดว่าmyandroidlibrary
build.gradle ควรมีลักษณะอย่างไร เราควรใช้ขอบเขตใด
เรามีสามตัวเลือก:
dependencies {
// Option #1
implementation project(':myjavalibrary')
// Option #2
compile project(':myjavalibrary')
// Option #3
api project(':myjavalibrary')
}
อะไรคือความแตกต่างระหว่างพวกเขากับสิ่งที่ฉันควรใช้
รวบรวมหรือ Api (ตัวเลือก # 2 หรือ # 3)
หากคุณกำลังใช้หรือcompile
api
แอปพลิเคชัน Android ของเราสามารถเข้าถึงการmyandroidcomponent
พึ่งพาซึ่งเป็นMySecret
ชั้นเรียน
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can access MySecret
textView.setText(MySecret.getSecret());
การใช้งาน (ตัวเลือก # 1)
หากคุณกำลังใช้implementation
การกำหนดค่าMySecret
จะไม่ถูกเปิดเผย
TextView textView = findViewById(R.id.text_view);
textView.setText(MyAndroidComponent.getComponent());
// You can NOT access MySecret
textView.setText(MySecret.getSecret()); // Won't even compile
ดังนั้นการกำหนดค่าที่คุณควรเลือก? ขึ้นอยู่กับความต้องการของคุณ
หากคุณต้องการที่จะเปิดเผยการพึ่งพาการใช้งานหรือapi
compile
หากคุณไม่ต้องการที่จะเปิดเผยการอ้างอิง (หลบซ่อนตัวอยู่ภายในโมดูลของคุณ) implementation
แล้วใช้
บันทึก:
นี่เป็นเพียงส่วนสำคัญของการกำหนดค่า Gradle โปรดดูตารางที่ 49.1 ปลั๊กอิน Java Library - การกำหนดค่าที่ใช้เพื่อประกาศการขึ้นต่อกันสำหรับคำอธิบายโดยละเอียดเพิ่มเติม
ตัวอย่างโครงการสำหรับคำตอบนี้มีอยู่ที่https://github.com/aldoKelvianto/ImplementationVsCompile