Ketika saya berpikir tentang pro dan kontra dari folder perpustakaan statis dan manajer paket saya merasa seperti folder perpustakaan adalah pendekatan yang lebih baik.
Pro saya melihat dengan folder perpustakaan:
- Tidak perlu alat eksternal untuk mengelola paket.
- Tidak diperlukan koneksi internet untuk membangun.
- Build lebih cepat (tidak ada pengecekan paket).
- Lingkungan yang lebih sederhana (lebih sedikit pengetahuan yang dibutuhkan).
Pro yang saya lihat dengan manajer paket:
- Membantu dengan pohon dependensi yang kompleks (dan itu dapat dikelola dengan mengunduh dependensi bersama dengan semua dependensinya).
- Membantu memeriksa apakah ada versi baru yang tersedia.
Tampaknya industri telah memutuskan untuk mengikuti jalur manajer paket untuk hampir semua yang dibangun hari ini. Jadi, apa yang saya lewatkan?
packages
dependency-management
package-managers
Ignacio Soler Garcia
sumber
sumber
Jawaban:
Poin penting yang hilang dari jawaban lain:
Menggunakan manajer paket berarti memiliki konfigurasi yang menunjukkan versi pustaka mana yang Anda gunakan dan memastikan bahwa informasi konfigurasi benar.
Mengetahui perpustakaan yang Anda gunakan, dan versi mana, sangat penting jika Anda:
Selain itu, ketika Anda benar-benar melakukan pembaruan, manajer paket (biasanya) memastikan setiap dependensi transitif diperbarui sesuai kebutuhan.
Sedangkan dengan
lib
folder, Anda hanya memiliki banyak file (mungkin biner, dan mungkin dimodifikasi), dan Anda harus menebak dari mana asalnya dan versi apa mereka (atau mempercayai beberapa README, yang mungkin atau mungkin tidak benar) ).Untuk membahas poin Anda yang lain:
Benar, tetapi a) sebagai pengembang perangkat lunak Anda perlu menginstal banyak alat, jadi satu lagi biasanya tidak masalah, dan b) biasanya hanya ada satu atau beberapa manajer paket di bidang tertentu (Maven / Gradle untuk Jawa, npm untuk JS / TypeScript, dll), jadi Anda tidak perlu menginstalnya puluhan.
Semua manajer paket yang saya kenal bekerja secara off-line, setelah mereka mengunduh dependensi yang diperlukan (yang dapat terjadi segera setelah mengunduh proyek itu sendiri).
Mungkin benar, tetapi tampaknya pengecekan paket offline tidak akan memakan banyak waktu (hanya membandingkan beberapa nomor versi). Pemeriksaan daring mungkin memakan waktu cukup lama, tetapi itu dapat dimatikan jika diinginkan (jika bahkan diaktifkan secara default - Maven misalnya tidak pernah memeriksa pembaruan untuk versi rilis).
Benar, tetapi seperti yang dijelaskan di atas,
lib
folder juga membutuhkan pengetahuan. Juga, seperti dijelaskan di atas, Anda mungkin hanya akan bekerja dengan beberapa manajer paket yang berbeda, yang sudah Anda ketahui.sumber
Kelebihan folder lib menghilang dengan cepat setelah Anda beralih dari pengembangan skala kecil ke pekerjaan yang lebih besar.
Misalnya, "manfaat" dari tidak memerlukan alat eksternal dikalahkan oleh pekerjaan yang diperlukan untuk mengelola dependensi Anda secara manual, sehingga alat itu akan menjadi Anda (dalam lebih dari satu pengertian dunia).
Anda tidak memerlukan koneksi internet untuk manajer paket. Anda dapat menggunakan repositori lokal.
Membangun lebih cepat mungkin benar, tetapi itu bukan sesuatu yang harus menentukan apakah akan menggunakan manajer paket atau tidak. Bagaimanapun, kita tidak membicarakan tentang besarnya perbedaan, dan ini juga tergantung pada konfigurasi Anda. Anda dapat dengan mudah membuat build lambat menggunakan manajer paket, tapi itu pada dasarnya sabotase.
Lingkungan yang lebih sederhana (lebih sedikit pengetahuan yang dibutuhkan)? Sekali lagi, dalam pengembangan skala kecil jelas merupakan suatu kemungkinan. Anda mungkin dapat memegang proyek sepenuhnya di kepala Anda, hingga masing-masing dari beberapa perpustakaan yang digunakan. Tambahkan makefile sederhana / skrip build lain dan Anda telah mendapatkan paket lengkap untuk diri Anda sendiri.
Tetapi itu tidak membuat lingkungan lebih sederhana, itu hanya bekerja di lingkungan yang sederhana. Dalam pengembangan skala yang lebih besar Anda akan senang bahwa Anda menggunakan perkakas standar alih-alih solusi khusus. Lagi pula, Anda hanya perlu mempelajarinya sekali saja (dan ketika manajer paket du jour digantikan oleh hal keren yang baru, Anda harus mempelajarinya juga).
sumber
blah install libfoo
. Dan kemudian, kalikan dengan, katakanlah, 5 dependensi.Anda kehilangan banyak manfaat dari manajer paket.
Anda juga melebih-lebihkan nilai "manfaat" Anda.
"Eksternal" untuk apa? Saya memeriksa executable NuGet ke dalam repositori saya. Ini satu-satunya biner yang saya rasa tidak apa-apa untuk check-in, karena kecil dan berarti saya tidak perlu memeriksa biner lain di dalamnya.
pip tidak menimbulkan masalah di bagian depan ini karena dibundel dengan Python secara default sekarang dan memecah dan mundur perubahan yang tidak kompatibel sangat jarang terjadi. Anda tidak akan mengembangkan kode Python tanpa menginstal Python secara eksternal ke proyek Anda.
Pada saat mereka mencapai adopsi luas, manajer paket cenderung sangat stabil. Anda tidak bisa pergi tanpa beberapa jenis perkakas diinstal secara global untuk sebagian besar proyek, dan manajer paket tunggal adalah persyaratan cukup berat ringan. Biasanya tidak jauh lebih rumit daripada menginstal runtime bahasa.
Saya tidak dapat terhubung ke database saya tanpa koneksi jaringan. Jika basis datanya adalah host Amazon, saya memerlukan koneksi internet penuh. Saya membutuhkan koneksi Internet untuk mendorong dan menarik perubahan melalui kontrol sumber; server build tidak dapat memeriksa kode untuk dibangun tanpa koneksi jaringan. Anda tidak dapat mengirim atau menerima email tanpa email . Anda tidak dapat mengunduh perpustakaan untuk meletakkannya di folder lib Anda tanpa perpustakaan! Pengembangan secara permanen tanpa koneksi internet hampir tidak pernah terjadi. Dalam beberapa kasus yang jarang terjadi jika diperlukan, Anda dapat mengatasinya dengan mengunduh paket ke lokasi yang dapat dikonsumsi oleh pengelola paket. (Saya tahu NuGet dan pip cukup senang untuk menarik dari folder sederhana atau drive jaringan; Saya kira kebanyakan orang juga bisa.)
30 detik selama pembuatan otomatis dan 5 detik selama pengembangan dev lokal merupakan pertukaran yang baik untuk manfaat yang saya sebutkan di atas. Ini adalah kerangka waktu sepele yang biasanya bahkan tidak layak dipertimbangkan dibandingkan dengan masalah yang dipecahkan manfaatnya.
Bagaimanapun, satu alat untuk manajemen paket terhadap apa pun untuk manajemen perpustakaan sebenarnya bukan perbandingan yang adil. Tanpa alat, Anda harus mempelajari proses kustom apa pun yang digunakan proyekuntuk mengelola perpustakaannya. Ini berarti Anda tidak pernah yakin apakah pengetahuan Anda yang ada berlaku untuk proyek baru yang Anda dekati. Anda harus berurusan dengan pendekatan campur aduk apa pun yang dilakukan seseorang, atau buat pendekatan Anda sendiri. Itu mungkin direktori yang berisi semua perpustakaan, atau mungkin sesuatu yang jauh lebih aneh. Mungkin untuk menghindari memeriksa perpustakaan, seseorang meletakkan semuanya di drive jaringan dan satu-satunya indikator versi adalah nama folder. Bagaimana itu atau instalasi global benar-benar lebih baik? Sebagai perbandingan, manajer paket memberi Anda konvensi bersih yang akan berlaku di sebagian besar proyek yang Anda temui.
Tema umum adalah bahwa mereka memberikan konsistensi, dokumentasi, dan fitur tidak hanya dalam proyek, tetapi bahkan di seluruh proyek. Ini menyederhanakan kehidupan setiap orang.
sumber
Baru-baru ini mengubah produk kami dari menggunakan perpustakaan yang diunduh secara manual ke manajemen paket otomatis dengan Nuget, saya dapat mengatakan bahwa menggunakan manajer paket memiliki manfaat besar.
Produk kami diimplementasikan di 27 proyek C #, yang relatif kecil dari standar saat ini. Beberapa dependensi pihak ketiga kami memiliki puluhan majelis.
Sebelum ke Nuget, jika saya ingin memperbarui semua dependensi kami ke versi terbaru, saya harus:
Dengan 27 proyek dan puluhan majelis ketergantungan, proses ini sangat rawan kesalahan dan bisa memakan waktu berjam-jam.
Sekarang kami telah memperbarui untuk menggunakan Nuget, itu semua dilakukan untuk saya dengan satu perintah.
sumber
Itu semacam tidak penting kan? Jika saya menggunakan manajer paket, saya tidak perlu memiliki folder lib. Saya juga tidak harus mengelola paket sendiri.
Selain itu tidak memiliki koneksi internet saat ini sementara pengembangan agak jarang terjadi (mungkin dengan pengecualian sedang dalam perjalanan), manajer paket yang baik seharusnya tidak mengharuskan Anda harus memiliki versi terbaru untuk membangun aplikasi Anda. Mungkin mengeluh, tetapi tidak ada alasan untuk tidak membangun dengan versi yang sudah diinstal
Itu speedboost yang cukup marjinal, tetapi Anda bisa membuat poin untuk itu.
Sebagian besar manajer paket sangat sederhana akhir-akhir ini sehingga hampir tidak ada gunanya mencoba menyiasatinya dengan melakukan ini. Bahkan ada klien visual jika Anda mau. Mereka benar-benar menyembunyikan banyak croft yang sedang terjadi.
Manajer paket juga memungkinkan Anda untuk berbagi paket ini di antara berbagai proyek. Jika 5 proyek saya menggunakan versi Boost yang sama, tidak perlu menduplikasi ini untuk setiap proyek. Ini terutama berlaku untuk pohon dependensi kompleks yang Anda bicarakan.
Dengan folder lib Anda mengelola paket hanya untuk proyek itu, sementara manajer paket memungkinkan Anda melakukan ini untuk seluruh lingkungan pengembangan Anda dengan satu alat.
sumber
nuget.org
akan baik-baik saja (templat default harus sudah diatur dengan cara ini).Ini adalah perbedaan antara hanya menggunakan perpustakaan (direktori lib) , dan menggunakannya, mempertahankan meta-informasi (manajer paket) . Informasi meta semacam itu menyangkut nomor versi, (transitif) ketergantungan antara perpustakaan dan semacamnya.
Diskusi neraka DLL, kompatibilitas perpustakaan, sistem modul java, OSGi dan semacamnya setidaknya harus cukup meyakinkan dari beberapa nilai memiliki beberapa bentuk manajemen ketergantungan.
Juga ada manfaat dari repositori bersama (lokal), sehingga beberapa proyek tidak perlu menyimpan salinan lib yang diimpor. Jika seseorang memiliki proyek dengan 20 submodul, beberapa modul memiliki 40 dependensi aneh.
sumber
Ada beberapa kasus di mana folder lib mungkin diperlukan, misalnya ketika berhadapan dengan perpustakaan usang (versi itu tidak lagi dipertahankan / tersedia), versi perpustakaan yang dimodifikasi secara lokal, ...
Tetapi untuk yang lainnya, itu seperti pengembang yang berperan sebagai pengelola paket:
Dan IMHO, itu kurang pengetahuan yang diperlukan, karena Anda harus belajar tentang penggunaan alat eksternal, tetapi lebih sedikit tentang perpustakaan (yaitu dependensi).
sumber
Ada masalah lain yang tidak dicakup oleh pertanyaan lain: berbagi deps.
Katakanlah, Anda memiliki dua paket yang membangun perpustakaan yang sama. Dalam kasus terbaik, tidak akan ada coflicts, tetapi ruang HDD / SSD yang sama digunakan dua kali. Yang terburuk, akan ada konflik varios, seperti versi.
Jika Anda menggunakan manajer paket, itu akan menginstal perpustakaan hanya sekali (per versi) dan sudah menyediakan path ke sana.
PS: tentu saja, Anda memerlukan tautan dinamis (atau fungsi serupa dalam bahasa Anda) untuk mendapatkan pro ini.
sumber
Salah satu alasan utama mengapa shared library dianggap sebagai item kemajuan di era 90-an sistem Unix dan Windows adalah bagaimana mereka dapat menurunkan penggunaan RAM ketika beberapa program menggunakan set library yang sama dimuat. Ruang kode hanya perlu dialokasikan SEKALI per perpustakaan yang tepat dan versi perpustakaan itu , satu-satunya penggunaan memori per-contoh yang tersisa adalah untuk variabel statis.
Banyak sistem operasi mengimplementasikan pustaka bersama dengan cara yang bergantung pada mekanisme seperti api unix mmap () - yang menyiratkan bahwa pustaka tidak hanya perlu versi yang persis sama tetapi juga FILE yang sama. Ini tidak mungkin untuk mengambil keuntungan penuh dari sebuah program yang mengirimkan set perpustakaannya sendiri.
Mengingat bahwa memori jauh lebih murah, dan versi perpustakaan dibutuhkan lebih beragam, daripada di tahun 90-an, argumen ini tidak membawa banyak bobot saat ini.
sumber