Metodologia consigliata per lavorare con le librerie condivise e Mercurial

7

Lavoro in un piccolo gruppo di sviluppatori che collaborano tutti su diversi progetti Zend PHP. Usiamo Mercurial con una collezione di repository upstream, così come Jenkins per test centralizzati e report sulla salute. Vogliamo implementare una libreria condivisa di classi comuni, ma stiamo lottando con la ricerca di un flusso di lavoro che funzioni bene con il nostro ambiente attuale.

Attualmente, ogni progetto contiene una struttura come questa:

- application        (project specific code)
- build              (temporary files generated by each build)
- library            (code used by multiple projects)
    - OurLibrary     (our company’s shared codebase)
    - Zend           (external libraries)
- tests              (test code specific to this project)

La cartella della libreria è esclusa dai test e quindi abbiamo creato un progetto specifico per eseguire test di unità contro la libreria condivisa. Questa decisione è stata presa principalmente per evitare di distribuire le classi di test per errore, cosa che può essere in gran parte mitigata da una modifica al processo di compilazione automatizzata, ma anche perché ritenevamo che fosse preferibile mantenere la libreria leggera.

Includiamo la libreria in ogni progetto sotto forma di sotto-repository Mercurial. Ciò significa che le modifiche introdotte nella libreria da uno sviluppatore che lavora su ProjectA wil non si propagherà automaticamente a ProjectB (buona) ma non si propagherà anche al progetto di test della libreria (non valido), pertanto Jenkins non ci avviserà automaticamente del codice potenzialmente in la libreria (pessima).

Una situazione ideale sarebbe che gli sviluppatori possono commettere modifiche alla libreria da qualsiasi progetto e che i nostri strumenti automatici eseguiranno quindi i test della libreria più recenti rispetto all'ultimo codice della libreria. Inoltre, questo non dovrebbe comportare un conflitto di versione quando uno sviluppatore tira una nuova versione dei test della libreria.

Esiste una metodologia consolidata per questo tipo di flusso di lavoro, o dovremmo esaminare la strutturazione delle nostre pratiche di lavoro in modo leggermente diverso prima di impegnarci completamente nei sub-reposli?

    
posta shanethehat 31.07.2012 - 12:18
fonte

2 risposte

2

Se fossi in me, avrei appena impostato il progetto "OurLibrary" come qualsiasi altro. Ad esempio, come un singolo progetto che include test.

Non vedo come l'esposizione dei test di un progetto ad altri progetti sarebbe mai problematica: poiché i test fanno parte della documentazione, direi che sarebbe una buona cosa!

Se per qualche motivo veramente non è possibile, un'altra opzione da considerare è che i progetti utilizzano una versione compilata di "OurLibrary". Questo ha alcuni inconvenienti propri - ad es. dovendo gestire la versione compilata della libreria; non essere in grado di modificare il progetto di codice 'OurLibrary' direttamente da altri progetti; ecc.

    
risposta data 31.07.2012 - 18:03
fonte
2

L'ultimo resort

Considera che i sub-repos sono considerati una funzionalità di last resort .

Questo significa in sostanza che non devi utilizzare i repository secondari a meno che tu non abbia una ragione legittima, hai una ragione legittima, quindi fallo.

Quando poi?

Ho alcune regole empiriche per i sottorepos, quindi li uso se e solo se:

  • Ho già il sottorepo come repository stand-alone (ovvero non è una libreria che posso incubare) AND
  • (È il codice che possiedo O il codice nel sub-repos è attivamente sviluppato) AND
  • L'aggiornamento del codice non è banale AND
  • (Esiste la potenziale situazione in cui potrei voler modificare il codice del subrepo e spingerlo indietro OPPURE inserire il codice del subrepo con un nuovo specifico del progetto pur essendo in grado di estrarre e integrare le ultime modifiche in quel repository (mantiene le cose flessibili nelle emergenze e nelle scadenze)).

Ultima ragione ...

Gestione della configurazione : quando voglio monitorare quali versioni di cosa coesistono con quali versioni di qualunque cosa e, cosa più importante, voglio avere il controllo di questi.

Ad esempio, supponi di voler testare il tuo ultimo sviluppo / ramo sperimentale di "OurLibrary" rispetto al tuo codice di produzione del tuo progetto attuale. Avere sottorepos in questa situazione è molto utile.

Continua a interrogarti

Potresti sentirti a tuo agio con l'idea di usare i subrepos. Non farlo. Continuate a chiedervi "quando non dovrei usare i sottorepos?", Se non vieni con una buona ragione non usarli e tutto andrà bene.

Relax

Supponete di non aver usato i sottorepos e di aver realizzato che dovreste avere perché la ragione X: potete sempre aggiustarla in seguito, in ogni caso, non è necessaria la cronologia del sottoreport per il vostro progetto corrente.

In un caso estremo in cui si desidera rimuovere i file in cui si supponeva che il sottorepo fosse dal giorno 0, utilizzare < strong> ConvertExtension per estrarre il sottorepo con un file di mappa.

Non lo consiglierei per il tuo caso (dove il tuo progetto principale è il genitore del tuo subrepo desiderato) ma sarà utile per il caso di utilizzo della gestione della configurazione in cui avrai un nuovo repository padre per gestire le versioni tra i componenti e il tuo progetto principale è uno di questi (allo stesso livello del sottorepo desiderato), ad esempio:

project (repo)
|-component1
|-component2
|-component3

Trasforma in

project (new-repo)
|-component1 (subrepo)
|-component2 (subrepo)
|-component3 (subrepo)

Altrimenti con:

project (repo)
|-app
|-lib
|--|-libA
|--|-libB

Trasformarsi in

project (repo)
|-app
|-lib
|--|-libA (subrepo)
|--|-libB

Si lascerà un buco nella cronologia in cui la libA non esiste finché non si crea la voce .hgsub.

    
risposta data 01.08.2012 - 02:25
fonte