transitive = true ใน Gradle ทำอะไรกันแน่ (wrt crashlytics)


174

Gradle transitive = trueทำอะไรกันแน่ มันไม่ได้เป็นที่ชัดเจนจากเอกสาร Gradle นี้อยู่ในบริบทของภายในcompile build.gradleในกรณีของฉันฉันขึ้นอยู่กับความล้มเหลวของ Android

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

เอกสาร Gradle หลายฉบับ ( ที่นี่และที่นี่ ) บ่งบอกว่าค่าเริ่มต้น "สกรรมกริยา" เป็นจริง ยังเอาtransitive = trueผลลัพธ์ในการอ้างอิงสกรรมกริยาที่ไม่ได้นำเข้ามา (โดยเฉพาะKitGroup)

class file for io.fabric.sdk.android.KitGroup not found

เอกสารบอกว่าเป็นค่าเริ่มต้นที่เป็นจริง แต่พฤติกรรมที่แท้จริงดูเหมือนจะตรงกันข้าม

ฉันกำลังใช้ Gradle 2.2.1 พฤติกรรมที่เปลี่ยนไประหว่าง 2.2 และ 2.4?

แก้ไข : การอ้างอิง Transitiveที่เกี่ยวข้องไม่ได้รับการแก้ไขสำหรับไลบรารี aar โดยใช้การไล่ระดับสี


เมื่อกำหนดการกำหนดค่าหรือเมื่อกำหนดการพึ่งพา?
dnault

การพึ่งพาของไฟล์ jar ได้รับการเลื่อนระดับเป็นโปรเจ็กต์ย่อย ไม่ใช่ทุกโครงการที่ต้องกำหนดว่าเป็นการพึ่งพาอย่างชัดเจน
Konrad

มีอะไรไม่ชัดเจนในเอกสารนี้ ?
Oleg Estekhin

3
@OlegEstekhin เอกสารไม่ตรงกับพฤติกรรมของรันไทม์ที่ฉันเห็น
Steve Kuo

คำตอบ:


153

คุณกำลังใช้@aarสัญลักษณ์
หมายความว่าคุณต้องการดาวน์โหลดเฉพาะสิ่งประดิษฐ์ aar และไม่มีการขึ้นต่อกัน
คุณสามารถตรวจสอบเอกสารส่วนนี้ได้:
ตรวจสอบ1.4.1.2. Artifact only notationหัวข้อ:

สัญกรณ์เท่านั้นที่สร้างการพึ่งพาโมดูลซึ่งดาวน์โหลดเฉพาะไฟล์ที่มีนามสกุลที่ระบุ ที่มีอยู่อธิบายโมดูลจะถูกละเลย

ใช้@aarสัญลักษณ์ถ้าคุณต้องการดาวน์โหลดการอ้างอิงคุณควรเพิ่มtransitive=trueสัญกรณ์ถ้าคุณต้องการที่จะดาวน์โหลดอ้างอิงคุณควรเพิ่ม

ฉันคาดหวังว่าการละเว้น @ aar ควรใช้งานได้โดยไม่ต้องเพิ่มแอตทริบิวต์สกรรมกริยา


7
ฉันยืนยันว่าไม่ใช้ @aar และลบแอตทริบิวต์ของสกรรมกริยาออก ความตั้งใจที่นี่คือนักพัฒนาอ้างอิงชุดผ้าอย่างชัดเจน (เช่น "คอมไพล์ 'com.crashlytics.sdk.android:crashlytics:2.5.5'") และแกน io.fabric.sdk.android จะถูกดึงเข้ามาทาง สกรรมกริยา หากคุณตั้งค่า transitive = false ดังนั้นคลาส io.fabric.sdk.android.Fabric จะไม่พบในเวลารวบรวม
Mark McClelland

7
"ฟีเจอร์" นี้แย่มากฉันต้องการ aar ที่มีการอ้างอิง โดยไม่ต้อง @aar มันค้นหาขวดและบ่น
dowi

12

ในหมายเหตุทั่วไปเพิ่มเติม: การตั้งค่าtransitive = falseในcrashlyticsไลบรารีทำให้ gradle ละเว้นไลบรารีทั้งหมดที่ต้องการcrashlytics (= "ไลบรารีชั่วคราว") และไม่ดาวน์โหลดและเชื่อมโยง

คุณจะต้องเพิ่มไลบรารีที่จำเป็นเข้ากับโครงการของคุณด้วยตนเองหรือพึ่งพาไลบรารีชั่วคราวอื่น ๆ ที่เพิ่มโดยการอ้างอิงอื่น

เริ่มต้นสำหรับ gradle transitive = trueคือ

ตัวอย่างและคำอธิบายแบบสมบูรณ์ที่นี่: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


ลิงก์ไม่ทำงาน ฉันกลัวว่าไม่ใช่ค่าเริ่มต้นจริงเพราะในบางกรณีเขียนโดยเฉพาะจริง
Morozov

แก้ไข @Morozov ลิงก์แล้ว ขอบคุณสำหรับ GOTCHA!
Vaiden

5

ฉันเดาว่าสิ่งประดิษฐ์ Crashlytics ที่คุณอ้างอิงด้วยตนเองระบุการพึ่งพาว่าไม่ใช่การถ่ายทอด ( transitive=false) เพื่อที่คุณจะไม่ถูกบังคับให้นำการอ้างอิงเหล่านั้นมาเป็นค่าเริ่มต้น นั่นเป็นเหตุผลที่คุณเห็นพฤติกรรมตรงข้าม ตัวอย่างเช่นนักพัฒนาซอฟต์แวร์บางคนอาจไม่ต้องการดึงบริการ Google Play ทั้งหมดหรืออะไรก็ตามที่ใช้ Crashlytics ถ้ามี

ดังนั้นโดยการลบสิ่งนั้น Gradle จะไม่ดึงการพึ่งพาและไม่สามารถสร้างได้อีกต่อไป คุณสามารถระบุการพึ่งพานั้นได้ด้วยตนเองหากคุณต้องการ

ที่ถูกกล่าว - ฉันคิดว่าปัญหาใหญ่ในมือคือคุณไม่ควรอ้างอิง Crashlytics สิ่งประดิษฐ์โดยตรง - คุณควรใช้ Fabric และดึง Crashlytics มาด้วย: https://dev.twitter.com/fabric/ Android / การบูรณาการ


คำแนะนำสำหรับการย้ายไปยังผ้าระบุการอ้างอิงถึงสิ่งประดิษฐ์ Crashlytics โดยตรงโดยสันนิษฐานว่าคุณกำลังใช้ "ชุด" ผ้านั้น: fabric.io/migrations/gradle
Mark McClelland

ดูเหมือนว่าคุณตั้งใจจะอ้างอิงชุดเครื่องมือโดยตรงและพวกเขาดึงในชั้นเรียน io.fabric.sdk.android ผ่านการพึ่งพาสกรรมกริยา
Mark McClelland

1

ชุดว่าควรพึ่งพาการแก้ไขนี้รวมถึงหรือไม่รวมการพึ่งพาสกรรมกริยา สิ่งประดิษฐ์ที่เป็นของการพึ่งพานี้อาจช่วยให้พวกเขามีการอ้างอิงในสิ่งประดิษฐ์อื่น ๆ หลังเรียกว่าสกรรมกริยาอ้างอิง


1

Gradle จะติดตามการขึ้นต่อกันตามค่าเริ่มต้น หากคุณต้องการปิดการทำงานของห้องสมุดเฉพาะให้ใช้การตั้งค่าสถานะสกรรมกริยา

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


2
สิ่งนี้เพิ่มคุณค่าใดเกินกว่าคำแนะนำในคำตอบที่ได้รับการโหวตอย่างสูง?
hrbrmstr

-19

transitiveควบคุมความไว Gradle จะใช้ค่าเริ่มต้นเป็นสกรรมกริยายกเว้นเมื่อไม่มี มีข้อผิดพลาดกับกริยาและคำลักษณนามเป็นดูhttps://issues.gradle.org/browse/GRADLE-3188


39
ฉันคิดว่ามันยุติธรรมที่คุณชี้ข้อผิดพลาด แต่คำอธิบายของคุณเกี่ยวกับอสังหาริมทรัพย์นั้นไม่มีประโยชน์ "การควบคุมสกรรมกริยาความแปรปรวนโดยปกติ Gradle เป็นค่าเริ่มต้นเป็นสกรรมกริยายกเว้นเมื่อไม่มี" จริงเหรอเพื่อน ... จริงเหรอ?
w3bshark

4
@ w3bshark ฉันคิดว่ามันตลก "ค่าเริ่มต้นเป็นสกรรมกริยายกเว้นเมื่อไม่มี" ค่อนข้างแม่นยำในประสบการณ์ของฉัน
Navin

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