Come si gestiscono le dipendenze esterne in un progetto open source?


23

Quando si scrive un progetto open source e si utilizza Google Code o GitHub e si desidera utilizzare una libreria come Lua, come si dovrebbe fare?

  • La dipendenza dovrebbe essere inclusa nel repository?
  • La dipendenza dovrebbe essere costruita all'interno dello stesso script di compilazione del resto del progetto o da uno script di compilazione separato?

Dato che la libreria non necessita di installazione prima della compilazione.

Risposte:


10

Consiglio vivamente di leggere la documentazione di Git sui sottomoduli ; risolve proprio questo problema, supponendo che tutte le tue fonti utilizzino Git. In caso contrario, è sempre possibile impostare un repository git ai fini dell'integrazione. Lo sforzo è banale e il payoff è significativo.


1
I sottomoduli sono un'implementazione piuttosto debole della gestione delle dipendenze in comune e in Git. Almeno git subtree è un'iterazione molto migliore
Lazy Badger,

4
-1 Includi i dettagli del link nella tua risposta, altrimenti la risposta è inutile quando il link scompare, come nel caso attuale. Sfortunatamente, non ho ancora il rappresentante da sottovalutare
Precastic il

@Precastic: se google il testo del link, ti ​​porta direttamente alla nuova pagina; Non sono sicuro di quanto più informativo possa essere.
Bryan Agee,

1
Si prega di leggere stackoverflow.com/help/how-to-answer - in particolare la sezione intitolata "Fornire il contesto per i collegamenti" (citazione: "Citare sempre la parte più pertinente di un collegamento importante, nel caso in cui il sito di destinazione non sia raggiungibile o sia permanentemente offline . ")
Precastic

17

La dipendenza dovrebbe essere inclusa nel repository?

Penso che le dipendenze debbano sempre essere incluse nel repository purché includerle non violi i termini di utilizzo. Poche cose sono più fastidiose di dover trovare manualmente le versioni giuste delle dipendenze giuste prima di poter creare una build. Certo, questo è facile quando hai strumenti automatici per farlo, che possono trovare e scaricare la dipendenza giusta, ma cosa succede se non sei connesso al web al momento o il server è inattivo o il progetto della dipendenza è stato completamente sospeso e portato offline? Includere sempre le dipendenze, se possibile.

La dipendenza dovrebbe essere costruita all'interno dello stesso script di compilazione del resto del progetto o da uno script di compilazione separato?

A meno che non ci sia una buona ragione per compilare dal sorgente, utilizzare versioni precompilate.

E perché non fornire opzioni nello script di build? Un semplice interruttore per scegliere se compilare o meno anche le dipendenze. Se l'utente sceglie di compilare anche le dipendenze, invoca semplicemente i propri script di build dallo script di build del tuo prodotto. Quindi l'utente può invocare manualmente gli script di compilazione delle dipendenze o scegliere di creare una build completa di tutto. Ma fornirei le dipendenze come file binari se non ci fosse una buona ragione per compilarle dai sorgenti. Penso che nel mondo Open Source, alcune licenze richiedano la distribuzione delle fonti insieme al prodotto, ma ciò non significa che non sia possibile precompilarle.

In breve: fornire un intero pacchetto autonomo, se possibile. Ciò fornirà la massima praticità ai tuoi utenti.


1
@tdammers: lo so, se stai installando software su un sistema Linux, il gestore dei pacchetti fa tutto il lavoro per te. Ma ciò richiede una connessione a Internet e il pacchetto deve essere in un determinato formato e ho esplicitamente dichiarato che gli strumenti di automazione possono aiutare in questo. Ad esempio, non è possibile utilizzare tale sistema per gli strumenti open source .NET. Se dai un'occhiata agli strumenti di sourceforge come NHibernate o Castle Windsor, vedrai che tutte le dipendenze sono incluse come binarie. E questa è l'unica cosa ragionevole da fare.
Falcon,

1
@tdammers: per coincidenza, devo installare OpenOffice SDK su una macchina Linux qui oggi. Poiché l'SDK non può essere installato tramite il gestore pacchetti, ho acquisito l'RPM dal sito Web. Quale pensi sia il primo messaggio che ricevo quando provo a eseguire "rpm --install"? errore: dipendenze non riuscite: ooobasis3.3-core01 è necessario per ooobasis3.3-sdk-3.3.0-9567.x86_64 - OH JOY!
Falcon,

2
@tdammers: hai ragione, ma nel caso mi piacerebbe avere questa ridondanza se solo l'installazione e l'installazione fossero facili. E quando vuoi vedere un inferno di dipendenza, dai un'occhiata a una directory / usr / lib. C'è di tutto: ridondanza, sovversioni e non sai nemmeno quale programma utilizza quali librerie. Certo, lascia che sia il gestore dei pacchetti a gestirlo! E se il gestore dei pacchetti non fosse in grado di gestirlo come nel caso dell'ufficio aperto di cui ho parlato. Ciò significa fondamentalmente che sei fregato e avrai difficoltà a installare qualcosa.
Falcon,

2
@tdammers: E più penso a questo e alle mie esperienze: non riesco nemmeno a contare le volte in cui ho dovuto creare collegamenti simbolici in questa directory solo perché le dipendenze non sono riuscite o alcuni programmi si sono rifiutati di essere eseguiti, anche se installati tramite un gestore pacchetti. Forse la situazione è migliorata ora, ma spesso è ancora solo un duro lavoro per far funzionare alcune cose. Problemi che avrebbero potuto essere evitati se avessero appena spedito la dipendenza con l'applicazione. Pagherò volentieri i pochi MB di spazio aggiuntivo solo per evitare quella seccatura.
Falcon,

2
@tdammers: gli innumerevoli tutorial sul web su come installare un programma specifico su un sistema Linux specifico sono testimoni di questo problema.
Falcon,

3

Ciò può essere o meno applicabile al tuo caso d'uso, ma ciò che facciamo al lavoro è includere una cartella "Riferimenti" in ogni ramo. Inseriamo DLL di terze parti qui. Ciò provoca molta duplicazione di binari relativamente invariati nel controllo del codice sorgente, ma lo spazio di archiviazione è economico e in ogni momento ogni ramo e tag ha esattamente le dipendenze (e la versione!) Che si aspetta.

Pre-compiliamo noi stessi le dipendenze e spostiamo i binari compilati in quella cartella. Anche la nostra libreria condivisa interna viene trattata in questo modo. In questo modo la stessa tecnica funziona per librerie proprietarie precompilate, librerie open source e librerie interne.


Per quanto riguarda effettivamente rispondere alla tua domanda ora che l'ho riletta, fai la stessa cosa e menziona solo che il tuo progetto utilizza una versione 1.3.5 precompilata di Lua.


1

La dipendenza dovrebbe essere inclusa nel repository?

Può essere referenziato nel repository (con qualsiasi utilizzabile per il metodo SCM), se questa dipendenza è parte integrante del prodotto (dipendenza dalla fonte), non dipendenza binaria, che può essere risolta separatamente

La dipendenza dovrebbe essere costruita all'interno dello stesso script di compilazione del resto del progetto o da uno script di compilazione separato?

Non importa affatto. Puoi preferire qualsiasi metodo, in base alle tue esigenze (velocità / trasparenza / gestibilità / ecc.)


0

Essendo un negozio Eclipse, abbiamo appena iniziato a utilizzare Buckminster per gestire il nostro processo di costruzione / assemblaggio / distribuzione.

Il nostro primo passo è stato quello di estrarre tutte le nostre librerie dipendenti esistenti e lasciare che Buckminster si occupasse di materializzare quelle corrette. Ciò consente una distribuzione molto più rapida e ridotta.

Il prossimo passo sarà spostare il nostro svnrepository monolitico in una serie di gitrepository modulari .

Non so quanto Buckminster si integrerebbe bene con i gitsottomoduli (o con i sottosposi mercuriali), ma è bello che Buckminster sia agnostico riguardo al VCS usato per un dato componente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.