ถ้าฉันเข้าใจถูกต้องแสดงว่าคุณกำลังสับสนProject.dependencies
บล็อกสคริปต์กับProject.buildscript.dependencies
บล็อกสคริปต์ (เช่นเดียวกับที่ฉันทำเมื่อฉันถึงคำถามนี้)
ฉันจะพยายามตอบสิ่งนี้ด้วยสิ่งที่ฉันพบ
ฉันคิดว่าคุณน่าจะคุ้นเคยกับProject.dependencies
บล็อกสคริปต์แล้ว ในบล็อกนี้เราประกาศการอ้างอิงที่จำเป็นโดยซอร์สโค้ดของเรา มีหลายวิธีในการประกาศการพึ่งพาที่เราต้องการสำหรับโครงการ ดูGradle Tutorial: ประเภทพึ่งพา ฉันจะพูดถึงเฉพาะส่วนที่เกี่ยวข้องกับปัญหานี้มากที่สุด:
compile 'org.hibernate:hibernate-core:5.0.5.Final'
เป็นการประกาศการพึ่งพาโมดูล คอนฟิกูเรชันคอมไพล์ (ซึ่งตอนนี้เลิกใช้แล้วโดยการกำหนดคอนฟิกการนำไปใช้งาน) เป็นเพียงคีย์เวิร์ดสำหรับImplementation only dependencies.
มันไม่ใช่คีย์เวิร์ดที่อธิบายประเภทของการอ้างอิง (ตามประเภทที่นี่ฉันกำลังติดตามสามประเภทที่กำหนดไว้ในบทช่วยสอนนั่นคือโมดูล ไฟล์และโครงการ)
ในGradle Tutorial: Organizing Build Logic มีข้อความว่า:
หากบิลด์สคริปต์ของคุณจำเป็นต้องใช้ไลบรารีภายนอกคุณสามารถเพิ่มลงในคลาสพา ธ ของสคริปต์ในตัวสคริปต์บิลด์ คุณทำได้โดยใช้เมธอด buildscript () ผ่านการปิดซึ่งประกาศคลาสพา ธ build script
นี่เป็นวิธีเดียวกับที่คุณประกาศตัวอย่างเช่นคลาสพา ธ คอมไพล์ Java คุณสามารถใช้ประเภทการอ้างอิงใด ๆ ที่อธิบายไว้ในประเภทการอ้างอิงยกเว้นการอ้างอิงโครงการ
เมื่อประกาศคลาสพา ธ build script แล้วคุณสามารถใช้คลาสในบิลด์สคริปต์ของคุณได้เหมือนกับคลาสอื่น ๆ บนคลาสพา ธ
ฉันหวังว่าทุกอย่างจะชัดเจนสำหรับคุณตอนนี้
ด้วยความclasspath "com.android.tools.build:gradle:${Versions.android_gradle_plugin}"
ที่เรากำลังตั้งclasspath
ด้วยวิธีcom.android.tools.build:gradle:${Versions.android_gradle_plugin}
ซึ่งเป็นพึ่งพาโมดูลที่ถูกใช้โดยสร้างสคริปต์ตัวเองมากกว่าแหล่งที่มาในโครงการของคุณ
ในทางตรงกันข้ามกับcompile 'org.hibernate:hibernate-core:5.0.5.Final'
ที่เรากำลังประกาศพึ่งพาโมดูลที่จำเป็นสำหรับโครงการของคุณกับรวบรวมการกำหนดค่า
TL; DR: ตัวclasspath
, compile
และimplementation
เป็นคำหลักทั้งหมดที่สามารถนำมาใช้กับการอ้างอิงภายใต้สถานการณ์ที่แตกต่างกัน ก่อนหน้านี้ใช้เมื่อคุณต้องการส่งผ่านไปยังสคริปต์บิลด์ในการพึ่งพาและหลังเป็นหนึ่งในการกำหนดค่าที่คุณอาจต้องการประกาศ
classpath
ไม่ใช่ขอบเขตการอ้างอิงที่ถูกต้อง