Non c'è una risposta esatta a questo.
In generale, il compositore non dovrebbe fare ciò che dovrebbe fare il sistema di compilazione e non dovresti inserire composer.lock in VCS. Il compositore potrebbe stranamente averlo al contrario. Gli utenti finali anziché i produttori non dovrebbero utilizzare i file di blocco. Di solito il tuo sistema di generazione mantiene ogni volta istantanee, directory riutilizzabili, ecc. Anziché una directory vuota. Le persone che effettuano il checkout di una libreria dal compositore potrebbero volere che la libreria utilizzi un blocco in modo che le dipendenze che la libreria carica sono state testate.
D'altro canto, ciò aumenta in modo significativo l'onere della gestione delle versioni, dove quasi sicuramente vorresti più versioni di ogni libreria poiché le dipendenze saranno rigorosamente bloccate. Se è probabile che ogni libreria abbia una versione leggermente diversa, allora hai bisogno di un supporto per più versioni della libreria e puoi anche vedere rapidamente le dimensioni delle dipendenze necessarie, quindi ti consigliamo di tenerlo sulla foglia.
Tenendo conto di ciò, non trovo davvero che i file di blocco siano utili né per le librerie né per i tuoi workdir. Per me è utile solo nella mia piattaforma di build / testing che persiste qualsiasi risorsa acquisita esternamente aggiornandola solo quando richiesto, fornendo build ripetibili per test, build e distribuzione. Sebbene ciò possa essere mantenuto in VCS non sempre con l'albero di origine, gli alberi di build saranno o altrove nella struttura VCS o gestiti da un altro sistema altrove. Se è memorizzato in un VCS, è discutibile se tenerlo o meno nello stesso repository degli alberi dei sorgenti perché altrimenti ogni pull può portare a una massa di asset di build. Mi piace piuttosto avere tutto in un repository ben organizzato, ad eccezione della produzione / credenziali sensibili e gonfia.
SVN può farlo meglio di git in quanto non ti obbliga ad acquisire l'intero repository (anche se sospetto che non sia nemmeno strettamente necessario per git ma il supporto per questo è limitato e non è comunemente usato). I repository di build semplici sono in genere solo un ramo di overlay in cui unisci / esporta l'albero di build. Alcune persone combinano risorse esterne nel loro albero di origine o separano ulteriormente, esterni, costruiscono e alberi di fonte. Di solito serve due scopi, costruire cache e build ripetibili, ma a volte tenerlo separato almeno su un certo livello consente anche build fresche / vuote e build multiple.
Esistono diverse strategie per questo e nessuna di esse funziona particolarmente bene con il persistere dell'elenco delle fonti a meno che tu non stia mantenendo una fonte esterna nella tua struttura di fonti.
Hanno anche cose come gli hash nel file, come si fondono quando due persone aggiornano i pacchetti? Solo questo dovrebbe farti pensare che forse questo è frainteso.
Gli argomenti che le persone avanzano per i file di blocco sono casi in cui hanno preso una visione molto specifica e restrittiva del problema. Desideri build ripetibili e build coerenti? Includi la cartella del fornitore in VCS. Quindi acceleri anche il recupero delle risorse e non devi dipendere da risorse esterne potenzialmente rotte durante la compilazione. Nessuna delle pipeline di creazione e distribuzione che creo richiede accesso esterno a meno che non sia assolutamente necessario. Se devi aggiornare una risorsa esterna è una e una sola volta. Ciò che il compositore sta cercando di ottenere ha senso per un sistema distribuito ad eccezione di quanto menzionato prima, non ha senso perché finirebbe con l'inferno della dipendenza dalla libreria per gli aggiornamenti della libreria con scontri comuni e gli aggiornamenti sono lenti come il pacchetto più lento da aggiornare.
Inoltre aggiorno ferocemente. Ogni volta che sviluppo aggiorno e collaudo tutto. C'è una finestra molto piccola in cui si può insinuare una significativa deriva della versione. Anche realisticamente, quando viene sostenuto il versioning semantico, che tende ad essere per il compositore, non si suppone che ci siano così tanti problemi di compatibilità o rotture.
In composer.json inserisci i pacchetti richiesti e le loro versioni. È possibile bloccare le versioni lì. Comunque quei pacchetti hanno anche dipendenze con versioni dinamiche che non saranno bloccate da composer.json (anche se non vedo perché non potresti metterli lì anche tu se vuoi che siano bloccati versione) quindi qualcun altro che esegue l'installazione di Composer ottiene qualcosa di diverso senza il lucchetto. Potrebbe non interessarti molto di questo o ti potrebbe interessare, dipende. Dovrebbe interessarti? Probabilmente almeno un po ', abbastanza per assicurarti di esserne consapevole in ogni situazione e potenziale impatto, ma potrebbe non essere un problema se hai sempre il tempo di eseguire solo DRY per primo e riparare tutto ciò che è stato aggiornato.
Il compositore delle seccature sta cercando di evitare a volte semplicemente non c'è e la seccatura che i file di blocco del compositore possono fare è significativa. Non hanno assolutamente alcun diritto di dire agli utenti cosa dovrebbero o non dovrebbero fare in merito alla costruzione rispetto alle risorse di origine (se aderire separatamente a VCS) in quanto non sono affari loro, non sono il capo di te o di me. "Il compositore dice" non è un'autorità, non sono il tuo ufficiale superiore né danno a nessuno alcuna superiorità su questo argomento. Solo tu conosci la tua situazione reale e cosa è meglio per quello. Tuttavia, potrebbero consigliare un corso di azione predefinito per gli utenti che non capiscono come funzionano le cose nel qual caso potresti voler seguirlo, ma personalmente non penso che " un vero sostituto per sapere come funzionano le cose e per essere in grado di allenare correttamente le tue esigenze. Alla fine, la loro risposta a questa domanda è la migliore ipotesi. Le persone che fanno il compositore non sanno dove dovresti tenere il tuo compositore, né dovrebbero. La loro unica responsabilità è dirti di cosa si tratta e cosa fa. A parte questo, devi decidere cosa è meglio per te.
Mantenere il file lock dentro è problematico per usabilità perché il compositore è molto riservato se usa lock o JSON e non sempre è bene usarli entrambi insieme. Se esegui install, usa solo il file di blocco che apparirebbe, quindi se aggiungi qualcosa a composer.json non verrà installato perché non è nel tuo blocco. Non è affatto intuitivo ciò che le operazioni realmente fanno e ciò che stanno facendo in relazione al file json / lock e a volte non sembrano nemmeno avere un senso (aiuto dice che install prende il nome di un pacchetto ma nel provare a usarlo dice no ).
Per aggiornare il blocco o fondamentalmente applicare le modifiche dal json devi usare update e potresti non voler aggiornare tutto. Il blocco ha la precedenza per la scelta di cosa deve essere installato. Se c'è un file di blocco, è quello che viene utilizzato. È possibile limitare l'aggiornamento in qualche modo, ma il sistema è ancora solo un casino.
L'aggiornamento richiede un'età, concerti di RAM. Ho anche il sospetto che se raccogli un progetto che non è stato toccato per un po 'che è sembrato dalle versioni che ha, che ci sarà più nel tempo e probabilmente non lo fa in modo efficiente che lo strangola.
Sono molto subdoli quando si tratta di avere comandi compositi segreti che non puoi aspettarti di essere compositi. Per impostazione predefinita, il comando di rimozione del compositore appare sulle mappe per l'aggiornamento del compositore e la rimozione del compositore, ad esempio.
La domanda che devi davvero porre non è se dovresti tenere il lucchetto nel tuo albero dei sorgenti o in alternativa se dovresti persistere da qualche parte in qualche modo o no, ma piuttosto dovresti chiederti cosa fa effettivamente, quindi puoi decidere da solo quando è necessario persistere e dove.
Sottolineerò che avere la possibilità di avere il blocco è una grande comodità quando si dispone di una solida strategia di persistenza delle dipendenze esterne poiché tiene traccia di te delle informazioni utili per rintracciarle (le origini) e aggiornarle ma se non lo fai allora non è né qui né lì. Non è utile quando ti viene forzato in gola come opzione obbligatoria per inquinare i tuoi alberi di origine. È una cosa molto comune trovare in basi di codice legacy in cui le persone hanno apportato molte modifiche a composer.json che non sono state realmente applicate e si rompono quando le persone cercano di usare compositore. Nessun compositore.lock, nessun problema di desincronizzazione.