Bagaimana saya bisa membuat kasus untuk "manajemen ketergantungan"?

9

Saat ini saya sedang mencoba membuat kasus untuk mengadopsi manajemen dependensi untuk build (ala Maven, Ivy, NuGet) dan membuat repositori internal untuk modul bersama, yang kami punya lebih dari selusin perusahaan. Apa poin penjualan utama dari teknik pembuatan ini? Yang saya miliki sejauh ini:

  • Mempermudah proses mendistribusikan dan mengimpor modul bersama, terutama peningkatan versi.
  • Membutuhkan dependensi dari modul bersama untuk didokumentasikan secara tepat.
  • Menghapus modul yang dibagikan dari kontrol sumber, mempercepat dan menyederhanakan pemeriksaan / pemeriksaan (ketika Anda memiliki aplikasi dengan 20+ pustaka, ini adalah faktor nyata) .
  • Memungkinkan lebih banyak kontrol atau kesadaran tentang lib pihak ketiga apa yang digunakan dalam organisasi Anda.

Apakah ada nilai jual yang saya lewatkan? Apakah ada studi atau artikel yang memberikan metrik peningkatan?

C. Ross
sumber
1
Saya pikir Anda sudah berhasil.
Mike Partridge
4
Saya tidak akan pernah mendapatkan kembali berjam-jam hidup saya sia-sia pada pengaturan Maven yang rusak. Saya menjadi yakin bahwa terlepas dari niat baik, dalam sebuah perusahaan besar, pada akhirnya akan menjadi kekacauan yang tidak terawat yang menghisap kehidupan Anda sampai Anda menjadi cangkang kosong.
MrFox
1
@suslik Peduli untuk menguraikan apa pengaturan "broken Maven" itu?
Andrew T Finnell
1
@AndrewFinnell Katakanlah ada 5 grup yang mengerjakan proyek yang perlu Anda tarik agar kompilasi Anda dikompilasi, dan karena koordinasi yang buruk, semua orang akhirnya bergantung pada versi perpustakaan yang berbeda. Kemudian ternyata salah satu proyek itu tidak dimaksudkan untuk 'dirilis' tetapi (tidak ada yang memberi tahu pakar!) Anda memiliki ketergantungan yang harus Anda penuhi. Ini bukan 'seharusnya' terjadi, tetapi resolusi otomatis membuatnya terlalu mudah. Jika setiap orang memiliki dir / libs untuk dipertahankan dalam svn itu akan memaksa orang untuk berhenti dan mengajukan pertanyaan sebelum hal-hal keluar dari kendali.
MrFox
2
@ McFox Itu memang karena koordinasi yang buruk, bukan resolusi ketergantungan Maven. Saya telah mengalami situasi yang sama dan saya bukan penggemar Maven, tapi saya pikir alat tidak seharusnya menyelesaikan masalah yang berhubungan dengan manusia seperti rilis prematur, kurangnya komunikasi, kurangnya pengujian, pemeliharaan yang buruk, dll.
script

Jawaban:

8

Saya tidak 100% yakin dengan positifnya. Ini beberapa negatifnya

  1. Anda sering berakhir menambahkan dependensi ke server / titik akhir pihak ketiga yang mungkin tidak stabil.

    Saya sudah mengalami dengan bower bahwa repo dari beberapa dependensi telah dihapus atau dipindahkan. Jadi dev baru datang, klon repo saya, ketik bower installdan mendapat kesalahan untuk repo yang tidak dapat diakses. Jika sebaliknya saya telah memeriksa kode pihak ke-3 ke dalam repo saya bahwa masalah itu hilang.

    Ini dipecahkan seperti yang disarankan OP jika Anda menarik deps dari salinan yang disimpan di server yang Anda jalankan.

  2. Lebih sulit untuk noobs.

    Saya bekerja dengan siswa seni dengan pengalaman baris perintah yang sangat sedikit. Mereka membuat karya seni dengan Processing, arduino, Unity3D, dan bertahan dengan sedikit pengetahuan teknologi. Mereka ingin menggunakan beberapa HTML5 / JavaScript yang saya tulis. Langkah karena bower

    1. Unduh Zip repo dari github (perhatikan itu di sebelah kanan setiap repo di github. Karena mereka tidak tahu git)
    2. Unduh dan instal simpul (sehingga kami dapat menjalankan npm untuk menginstal bower)
    3. Instal git atau msysgit (karena bower membutuhkannya dan itu tidak diinstal pada mesin banyak siswa)
    4. Pasang bower ( npm install -g bower)
    5. bower install (akhirnya untuk mendapatkan dependensi kami)

    Langkah 2-5 semua bisa dihapus jika kita hanya memeriksa file ke repo github kita. Langkah-langkah itu mungkin terdengar sangat mudah bagi Anda dan saya. Bagi para siswa mereka sangat membingungkan dan mereka ingin tahu apa semua langkah di mana dan untuk apa mereka mungkin belajar yang baik tetapi sepenuhnya ortogonal dengan topik kelas dan kemungkinan besar dengan cepat dilupakan.

  3. Ini menambah langkah lain saat menarik.

    Itu terjadi berkali-kali saya melakukan git pull origin masterdan kemudian menguji kode saya dan butuh 5 hingga 10 menit untuk mengingat saya perlu mengetik bower install untuk mendapatkan deps terbaru. Saya yakin itu mudah diselesaikan dengan beberapa hook script kait.

  4. Itu membuat git bercabang lebih sulit

    Jika 2 cabang memiliki deps yang berbeda, Anda agak kacau. Saya kira Anda bisa mengetik bower installsetelah setiap git checkout. Begitu banyak untuk kecepatan.

Adapun positif Anda, saya pikir ada contoh kontra untuk masing-masing

Mempermudah proses mendistribusikan dan mengimpor modul bersama, terutama peningkatan versi.

vs apa? Ini tentu tidak mudah untuk didistribusikan. Menarik satu repo bukannya 20 tidak mudah dan lebih mungkin gagal. Lihat # 1 di atas

Menghapus modul yang dibagikan dari kontrol sumber, mempercepat dan menyederhanakan pemeriksaan / pemeriksaan (ketika Anda memiliki aplikasi dengan 20+ pustaka, ini adalah faktor nyata).

Sebaliknya itu berarti Anda bergantung pada orang lain untuk perbaikan. Berarti jika deps Anda menarik dari sumber pihak ke-3 dan Anda perlu bug diperbaiki Anda harus menunggu mereka untuk menerapkan patch Anda. Lebih buruk lagi, Anda mungkin tidak bisa hanya mengambil versi yang Anda inginkan ditambah tambalan Anda, Anda harus mengambil yang terbaru yang mungkin tidak kompatibel dengan proyek Anda.

Anda dapat menyelesaikannya dengan mengkloning repo mereka secara terpisah dan kemudian mengarahkan proyek Anda ke salinan Anda. Kemudian Anda menerapkan perbaikan apa pun pada salinan Anda. Tentu saja Anda juga bisa melakukan itu jika Anda hanya menyalin sumber ke repo Anda

Memungkinkan lebih banyak kontrol atau kesadaran tentang lib pihak ketiga apa yang digunakan dalam organisasi Anda.

Itu sepertinya bisa diperdebatkan. Hanya perlu devs untuk meletakkan perpustakaan pihak ke-3 di folder mereka sendiri di bawah <ProjectRoot>/3rdparty/<nameOfDep>. Sama mudahnya untuk melihat lib pihak ke-3 apa yang digunakan.

Saya tidak mengatakan tidak ada yang positif. Tim terakhir yang saya ikuti memiliki> 100 perwakilan pihak ketiga. Saya hanya menunjukkan tidak semua mawar. Saya sedang mengevaluasi apakah saya harus menyingkirkan bower untuk kebutuhan saya misalnya.

gman
sumber
Wow, banyak suara negatif dan tidak ada satu pembenaran untuk mereka. Kerja bagus! :(
gman
Saya tidak pernah menggunakan bower, tetapi kebutuhan untuk installsetiap kali Anda checkout sepertinya cacat desain. Itu harus memeriksa konfigurasi itu ketika membangun sebuah proyek: jika ada perubahan, itu harus dibangun kembali dari awal. Juga, memindahkan repo tidak relevan dengan Maven, karena menarik artefak dari repositori Maven, yang menyimpan artefak, bukan repo yang sebenarnya dengan kode. Anda hanya dapat mengubah artifactIddan groupIddalam versi artifak berikutnya jika Anda menerbitkannya di repositori Maven. Jadi, poin Anda # 1 dan # 4 sebagian besar tidak relevan dengan Maven khususnya. # 3 dapat diganti dengan mvn clean(kadang-kadang)
scriptin
Meskipun benar, # 2 bukanlah kerugian - ini merupakan trade off. Tentu saja, Anda harus mempelajari alat Anda! Sebagai contoh, Git cukup sulit untuk dipahami, tetapi saya tidak akan menyerah karena dem noobs.
scriptin
1

Lihatlah The Twelve Factor App

Khususnya membaca tentang apa yang mereka katakan tentang dependensi . Anda akan melihat bahwa desain yang baik menyediakan mekanisme deklaratif untuk mencari dependensi, di Jawa ini sering diwujudkan melalui Maven. Ivy dan NuGet bekerja dengan baik, tetapi Maven saat ini adalah pemimpin di lapangan dan Ivy jelas merupakan kerja keras.

Jika Anda mematuhi proses rilis Maven (mengembangkan snapshot hingga rilis resmi siap, jangan pernah mencoba untuk menimpa rilis sebelumnya, gunakan manajer repositori yang tepat seperti Nexus atau Artifactory) maka Anda harus memiliki proses build yang bersenandung dengan baik.

Setelah Anda memiliki proses pembuatan deklaratif yang solid di tempatnya, itu membuka pintu ke praktik bagus lainnya seperti Integrasi Berkelanjutan dengan Jenkins , Analisis Kode Berkelanjutan dengan Sonar dan Anda akan menemukan diri Anda mencari strategi percabangan kontrol versi yang lebih baik menggunakan git .

Masing-masing di atas dibangun di atas inti yaitu Maven. Hari-hari ini, itu adalah keputusan yang tidak masuk akal.

Gary Rowe
sumber
Saya melihat The Twelve Factor App, tetapi ini sangat kontroversial, dan hanya sedikit yang relevan. Juga mendorong Maven tidak membantu saya menjelaskan mengapa kita perlu injeksi ketergantungan. Secara keseluruhan jawaban ini tidak membantu saya menjual Ketergantungan Injeksi, hanya memberi tahu saya banyak hal yang perlu saya lakukan untuk proses pembangunan saya.
C. Ross
2
Ketergantungan Injeksi (pola desain) bukan Manajemen Ketergantungan (pola bangun). Anda telah membahas semua aspek terpenting dalam pertanyaan Anda. Jika tim Anda masih perlu diyakinkan setelah mendengarnya, maka melihat apa yang akan menyebabkan Manajemen Ketergantungan harus menjadi penentu akhir.
Gary Rowe
0

Dan item # 1 di daftar 10 teratas kami adalah ...

(drum roll)

Setiap pengembang membangun dengan versi yang sama persis dari semua dependensi, sehingga Anda tidak perlu bertanya-tanya apa yang akan digunakan untuk produksi.

Ross Patterson
sumber
2
Apa bedanya dengan memeriksa dependensi? Bahkan jika Anda tidak memeriksa dependensi Anda berisiko mengambil pihak ketiga melanggar distro Anda. Saya pernah mengalami hal ini lebih dari satu kali ketika beberapa depower menunjuk ke repo seseorang yang dihapus atau diganti namanya. Jika saya baru saja menyalin sumber ke repo kami, masalah itu hilang.
GM