Hindari konflik versi ketergantungan?

10

Setiap proyek Java yang menggunakan toples saya, hampir pasti akan memiliki ketergantungan tambahan pada toples lain, yang juga berisi toples saya.

Masalahnya, toples lain itu memiliki banyak versi.

Bagaimana saya bisa menghindari masalah yang mungkin timbul, dalam kasus yang mungkin bahwa versi proyek Anda dari guci ke-2 berbeda dari versi guci ke-2 saya?

Saya tidak ingin pengguna saya memiliki kerumitan ekstra untuk melakukan beberapa trik pemuatan kelas yang mewah untuk menambahkan toples saya.

Haruskah saya membuat banyak versi yang berbeda dari toples saya, untuk setiap versi yang memungkinkan dari ketergantungan bersama itu? Dan kemudian Anda hanya memilih versi toples saya yang menggunakan versi toples apa pun yang Anda miliki?

Apakah ada cara yang lebih cerdas untuk menangani ini, dan mempermudah orang menggunakan toples saya tanpa konflik?

Dingredient
sumber

Jawaban:

10

Ini bukan Anda masalah. Terserah pengguna akhir Anda untuk menyelesaikannya. Itu hanya datang dengan wilayah menggunakan dependensi pihak ketiga, dan saya harus menyelesaikan konflik ketergantungan lebih dari yang saya hitung. Anda tidak dapat mengharapkan untuk mengakomodasi konflik ketergantungan khusus setiap proyek.

Perangkat lunak Anda harus beroperasi dengan benar dengan versi terbaru dari dependensi Anda. Kecuali jika dependensi mengubah antarmuka mereka pada setiap rilis, Anda harus memiliki serangkaian kompatibilitas (mis. Perangkat lunak Anda berfungsi untuk semua versi dalam jangkauan [2.0.0, 3.0.0)). Selama Anda memelihara perangkat lunak, Anda harus mencoba membuatnya tetap kompatibel dengan versi terbaru dari semua dependensi Anda.

Yang mengatakan, berikut adalah beberapa hal yang saya anggap berguna sebagai pengembang menggunakan perangkat lunak Anda dengan versi saya yang berbeda dari ketergantungan Anda.

  • Jika integrasi antara proyek Anda dan proyek lain erat, ada baiknya memiliki bagan kompatibilitas dalam dokumentasi Anda. Apapun, Anda harus menyebutkan masalah yang diketahui dengan versi tertentu dari ketergantungan dalam dokumentasi Anda. Kalau tidak, pengembang harus menemukan versi yang kompatibel melalui coba-coba.
  • Abaikan kolaborasi dengan dependensi melalui antarmuka, dan rancang perangkat lunak Anda sehingga implementasinya dapat diganti dengan injeksi ketergantungan. Itu memungkinkan saya sebagai pengguna akhir untuk menggantikan integrasi saya sendiri dengan versi x perpustakaan tanpa mengganggu Anda.
  • Memiliki pelacak masalah publik sehingga pengguna Anda dapat meminta Anda untuk mendukung versi tertentu dari ketergantungan bersama. Jika Anda menemukan banyak pengguna menginginkan dukungan untuk versi ketergantungan yang tidak kompatibel, Anda dapat menerbitkan versi untuk keduanya. Lihat contoh Maven ini di mana mereka menargetkan banyak platform - dukungan untuk versi dependensi yang berbeda harus serupa.
Samuel
sumber
Apakah Java memiliki sesuatu seperti pengaturan App.config binding assembly di .NET di mana Anda dapat menentukan "pustaka yang meminta dependensi Foo v3.0.2 sebenarnya harus menggunakan Foo v3.0.5 dan berpura-pura seperti itu v3.0.2"? Saya belum melakukan Java dalam lebih dari 11 tahun sekarang, jadi ingatan saya tentang bagaimana menangani ini hanya PERGI.
John Zabroski