Bagaimana seseorang menangani ketergantungan eksternal dalam proyek sumber terbuka?

23

Ketika seseorang menulis proyek open-source dan menggunakan Google Code atau GitHub, dan ingin menggunakan perpustakaan seperti Lua, bagaimana cara melakukannya?

  • Haruskah ketergantungan dimasukkan dalam repositori?
  • Haruskah ketergantungan dibangun dari dalam skrip build yang sama dengan sisa proyek, atau dari skrip build terpisah?

Mengingat bahwa perpustakaan tidak perlu instalasi sebelum kompilasi.

sayap kanan
sumber

Jawaban:

10

Saya akan sangat merekomendasikan membaca dokumentasi Git tentang submodul ; itu mengatasi masalah ini, dengan asumsi bahwa semua sumber Anda menggunakan Git. Jika tidak, Anda selalu dapat mengatur git repo untuk tujuan integrasi. Upaya ini sepele, dan imbalannya signifikan.

Bryan Agee
sumber
1
Submodules agak lemah dalam implementasi dependensi-manajemen yang sama dan dalam Git. Setidaknya git subtree adalah iterasi yang jauh lebih baik
Lazy Badger
4
-1 Harap sertakan detail tautan dalam jawaban Anda jika tidak jawabannya tidak berguna saat tautan hilang - seperti halnya sekarang. Sayangnya, saya tidak memiliki perwakilan untuk
membatalkan
@Precastic: Jika Anda Google teks tautan, itu membawa Anda langsung ke halaman baru; Saya tidak yakin seberapa banyak informasi yang dapat disampaikan.
Bryan Agee
1
Harap baca stackoverflow.com/help/how-to-answer - khususnya bagian berjudul "Berikan konteks untuk tautan" (kutipan: "Selalu kutip bagian yang paling relevan dari tautan penting, jika situs target tidak dapat dijangkau atau offline secara permanen . ")
Precastic
17

Haruskah ketergantungan dimasukkan dalam repositori?

Saya pikir dependensi harus selalu dimasukkan dalam repositori selama termasuk mereka tidak melanggar ketentuan penggunaan. Beberapa hal lebih menyebalkan daripada harus menemukan versi yang tepat dari dependensi yang tepat secara manual sebelum Anda bisa membuatnya. Tentu, ini mudah ketika Anda memiliki alat otomatis untuk melakukan ini untuk Anda, yang dapat menemukan dan mengunduh dependensi yang tepat, tetapi bagaimana jika Anda tidak terhubung ke web saat ini atau server sedang down atau proyek dependensi telah sepenuhnya dihentikan dan dimatikan? Selalu sertakan dependensi jika memungkinkan.

Haruskah ketergantungan dibangun dari dalam skrip build yang sama dengan sisa proyek, atau dari skrip build terpisah?

Kecuali ada alasan bagus untuk mengkompilasi dari sumber, gunakan versi yang sudah dikompilasi.

Dan mengapa tidak memberikan opsi dalam skrip build? Peralihan sederhana untuk memilih apakah dependensi juga harus dikompilasi atau tidak. Jika pengguna memilih untuk mengkompilasi dependensi juga, maka cukup panggil skrip build mereka sendiri dari skrip build produk Anda. Jadi pengguna dapat menjalankan skrip build dependcies secara manual atau memilih untuk membuat build lengkap dari segalanya. Tapi saya hanya akan memberikan dependensi sebagai binari jika tidak ada alasan yang baik untuk mengkompilasi mereka dari sumber. Saya pikir di dunia Open Source, beberapa lisensi mengharuskan Anda untuk mendistribusikan sumber bersama dengan produk Anda, tetapi itu tidak berarti Anda tidak dapat mengkompilasinya.

Singkatnya: Berikan paket kerja mandiri yang utuh jika memungkinkan. Ini akan memberikan kenyamanan paling bagi pengguna Anda.

Elang
sumber
1
@tdammers: Saya tahu, jika Anda menginstal perangkat lunak pada sistem linux manajer paket melakukan semua pekerjaan untuk Anda. Tapi itu memerlukan koneksi internet dan paket harus dalam format tertentu dan saya secara eksplisit menyatakan bahwa alat otomatisasi dapat membantu dengan ini. Anda tidak dapat menggunakan sistem seperti itu untuk alat .NET open source, misalnya. Jika Anda melihat alat sourceforge seperti NHibernate atau Castle Windsor, maka Anda akan melihat bahwa semua dependensi termasuk sebagai binari. Dan itu satu-satunya hal yang masuk akal untuk dilakukan.
Falcon
1
@tdammers: Secara kebetulan, saya harus menginstal OpenOffice SDK pada mesin linux di sini hari ini. Karena SDK tidak dapat diinstal melalui manajer paket, saya mengambil RPM dari situs web. Apa yang Anda pikirkan adalah pesan pertama yang saya dapatkan ketika mencoba menjalankan "rpm --install"? kesalahan: dependensi gagal: ooobasis3.3-core01 diperlukan oleh ooobasis3.3-sdk-3.3.0-9567.x86_64 - OH JOY!
Falcon
2
@tdammers: Anda benar, tetapi jika saya ingin memiliki redundansi ini jika hanya pengaturan dan instalasi yang mudah. Dan ketika Anda ingin melihat neraka ketergantungan, lihat direktori / usr / lib. Ada segalanya: redundansi, subversi dan Anda bahkan tidak tahu program mana yang menggunakan lib. Tentu, biarkan manajer paket menanganinya! Tetapi bagaimana jika manajer paket tidak dapat menanganinya seperti dalam kasing kantor yang saya sebutkan. Itu pada dasarnya berarti Anda kacau dan Anda akan kesulitan menginstal sesuatu.
Falcon
2
@tdammers: Dan semakin saya memikirkan hal ini dan pengalaman saya: Saya bahkan tidak bisa menghitung berapa kali saya harus membuat symlink di direktori ini hanya karena dependensi gagal atau beberapa program menolak untuk dijalankan, bahkan ketika diinstal melalui manajer paket. Mungkin situasinya telah menjadi lebih baik sekarang, tetapi seringkali masih hanya kerja keras untuk menjalankan beberapa hal. Masalah yang bisa dihindari jika mereka baru saja mengirimkan ketergantungan dengan aplikasi. Saya dengan senang hati akan membayar beberapa MB ruang tambahan hanya untuk menghindari kerumitan itu.
Falcon
2
@tdammers: Tutorial yang tak terhitung jumlahnya di web tentang cara menginstal program tertentu pada sistem linux tertentu adalah saksi dari masalah ini.
Falcon
3

Ini mungkin atau mungkin tidak berlaku untuk use case Anda, tetapi apa yang kami lakukan di tempat kerja adalah menyertakan folder "Referensi" di setiap cabang. Kami menempatkan DLL pihak ke-3 di sini. Ini menyebabkan banyak duplikasi biner yang relatif tidak berubah dalam kontrol sumber, tetapi penyimpanannya murah dan pada setiap titik setiap tag & cabang memiliki dependensi yang tepat (dan versi!) Yang diharapkan.

Kami melakukan pre-kompilasi dependensi sendiri dan memindahkan binari yang dikompilasi ke folder itu. Pustaka bersama in-house kami sendiri diperlakukan dengan cara ini juga. Dengan cara itu, teknik yang sama berfungsi untuk pustaka berpemilik yang dikompilasi sebelumnya, pustaka sumber terbuka, dan pustaka in-house.


Sejauh menjawab pertanyaan Anda sekarang setelah saya membacanya kembali, lakukan hal yang sama, dan sebutkan saja proyek Anda menggunakan versi 1.3.5 Lua yang telah dikompilasi.

Bryan Boettcher
sumber
1

Haruskah ketergantungan dimasukkan dalam repositori?

Ia dapat dirujuk dalam repositori (dengan cara apa pun yang dapat digunakan untuk metode SCM), jika dependensi ini merupakan bagian integral dari produk (ketergantungan-sumber), bukan ketergantungan-biner, yang dapat diselesaikan secara terpisah.

Haruskah ketergantungan dibangun dari dalam skrip build yang sama dengan sisa proyek, atau dari skrip build terpisah?

Tidak masalah sama sekali. Anda dapat memilih metode apa pun, sesuai dengan kebutuhan Anda (kecepatan / transparansi / pengelolaan / dll)

Malas Badger
sumber
0

Menjadi toko Eclipse, kami baru saja mulai menggunakan Buckminster untuk mengelola proses build / assemble / deploy kami.

Tahap pertama kami adalah mencabut semua perpustakaan kami yang ada dan membiarkan buckminster mengurus mewujudkan yang benar. Ini membuat penyebaran menjadi lebih cepat dan lebih kecil.

Langkah selanjutnya adalah memindahkan svnrepositori monolitik ke serangkaian gitrepositori modular .

Saya tidak tahu seberapa baik buckminster akan diintegrasikan dengan gitsubmodul (atau subrepo lincah dalam hal ini), tetapi bagus bahwa buckminster agnostik sehubungan dengan VCS yang digunakan untuk komponen tertentu.

Mark Booth
sumber