Não há resposta exata para isso.
De um modo geral, o compositor não deve estar fazendo o que o sistema de compilação deve fazer e você não deve colocar o compositor.lock no VCS. O compositor pode estranhamente tê-lo ao contrário. Os usuários finais, em vez de produzir, não devem usar arquivos de bloqueio. Normalmente, seu sistema de compilação mantém instantâneos, diretórios reutilizáveis etc., em vez de um diretório vazio a cada vez. As pessoas que fazem check-out de uma lib do compositor podem querer que a lib use um bloqueio, para que as dependências carregadas pela lib tenham sido testadas.
Por outro lado, isso aumenta significativamente a carga do gerenciamento de versões, onde você quase certamente desejaria várias versões de cada biblioteca, pois as dependências serão estritamente bloqueadas. Se é provável que todas as bibliotecas possuam uma versão ligeiramente diferente, você precisa de algum suporte para várias bibliotecas e também pode ver rapidamente o tamanho das dependências necessárias, daí o conselho para mantê-la na folha.
Levando isso em consideração, eu realmente não acho que os arquivos de bloqueio sejam úteis, seja em bibliotecas ou em suas próprias equipes de trabalho. Seu único uso é na minha plataforma de construção / teste, que persiste todos os ativos adquiridos externamente, apenas atualizando-os quando solicitados, fornecendo construções repetíveis para teste, construção e implantação. Enquanto isso pode ser mantido no VCS, nem sempre é mantido com a árvore de origem, as árvores de construção estarão em outro lugar na estrutura do VCS ou gerenciadas por outro sistema em outro lugar. Se ele é armazenado em um VCS, é discutível mantê-lo no mesmo repositório que as árvores de origem, caso contrário, cada puxão pode trazer uma massa de ativos de construção. Eu gosto bastante de ter tudo em um repositório bem organizado, com exceção das credenciais de produção / sensíveis e inchaço.
O SVN pode fazer isso melhor do que o git, pois não força você a adquirir o repositório inteiro (embora eu suspeite que isso também não seja estritamente necessário para o git, mas o suporte a ele é limitado e geralmente não é usado). Os repositórios de construção simples geralmente são apenas uma ramificação de sobreposição na qual você mescla / exporta a árvore de construção. Algumas pessoas combinam recursos externos em sua árvore de origem ou separam outras árvores externas, de construção e de origem. Geralmente, ele serve a dois propósitos, criar cache e compilações repetíveis, mas, às vezes, mantê-la separada em pelo menos algum nível também permite compilações novas / em branco e várias compilações facilmente.
Existem várias estratégias para isso e nenhuma delas funciona particularmente bem com a persistência da lista de fontes, a menos que você mantenha uma fonte externa em sua árvore de fontes.
Eles também possuem itens como hashes no arquivo. Como isso ocorre quando duas pessoas atualizam pacotes? Isso por si só deve fazer você pensar que talvez isso seja mal interpretado.
Os argumentos apresentados pelas pessoas para arquivos de bloqueio são casos em que eles adotam uma visão muito específica e restritiva do problema. Deseja construções repetíveis e construções consistentes? Inclua a pasta do fornecedor no VCS. Além disso, você também acelera a busca de ativos e não precisa depender de recursos externos potencialmente danificados durante a compilação. Nenhum dos pipelines de criação e implantação criados exige acesso externo, a menos que seja absolutamente necessário. Se você precisar atualizar um recurso externo, é uma e apenas uma vez. O que o compositor está tentando obter faz sentido para um sistema distribuído, exceto como mencionado anteriormente, não faz sentido, porque acabaria com a dependência da biblioteca para atualizações de bibliotecas com conflitos e atualizações comuns tão lentos quanto o pacote de atualização mais lento.
Além disso, eu atualizo ferozmente. Toda vez que desenvolvo, atualizo e testo tudo. Há uma janela muito pequena para que ocorra o desvio significativo de versões. Realisticamente, também, quando o versionamento semântico é mantido, o que tende a ser para o compositor, você não deve ter tantos problemas de compatibilidade ou quebras.
No compositer.json, você coloca os pacotes necessários e suas versões. Você pode bloquear as versões lá. No entanto, esses pacotes também têm dependências com versões dinâmicas que não serão bloqueadas pelo composer.json (embora eu não entenda por que você também não pode colocá-los lá se você quiser que a versão seja bloqueada), então alguém executando o compositer instala obtém algo diferente sem a trava. Você pode não se importar muito com isso ou pode se importar, depende. Você deveria se importar? Provavelmente, pelo menos um pouco, o suficiente para garantir que você esteja ciente disso em qualquer situação e impacto potencial, mas também pode não ser um problema se você sempre tiver tempo para apenas DRY executar primeiro e corrigir qualquer atualização.
Às vezes, o compositor de aborrecimentos está tentando evitar às vezes simplesmente não existe, e o aborrecimento que os arquivos de bloqueio do compositor podem fazer é significativo. Eles não têm absolutamente o direito de dizer aos usuários o que devem ou não fazer com relação à compilação versus os recursos de origem (se devem unir ou separar no VCS), já que isso não é da conta deles, eles não são o chefe de você ou de mim. "O compositor diz" não é uma autoridade, eles não são seus oficiais superiores nem dão a ninguém qualquer superioridade sobre esse assunto. Só você conhece sua situação real e o que é melhor para isso. No entanto, eles podem recomendar um curso de ação padrão para usuários que não entendem como as coisas funcionam. Nesse caso, convém seguir isso, mas pessoalmente não acho que ' é um substituto real para saber como as coisas funcionam e poder treinar adequadamente suas necessidades. Em última análise, a resposta para essa pergunta é o melhor palpite. As pessoas que fazem o compositor não sabem onde você deve guardá-lo. A única responsabilidade deles é contar o que é e o que faz. Fora isso, você precisa decidir o que é melhor para você.
Manter o arquivo de bloqueio é problemático para a usabilidade, pois o compositor é muito discreto sobre se ele usa bloqueio ou JSON e nem sempre é bom usar os dois juntos. Se você executar o install, ele usará apenas o arquivo de bloqueio que apareceria; se você adicionar algo ao composer.json, ele não será instalado porque não está no seu bloqueio. Não é intuitivo o que as operações realmente fazem e o que estão fazendo em relação ao arquivo json / lock e às vezes nem parecem fazer sentido (a ajuda diz que a instalação leva o nome de um pacote, mas ao tentar usá-lo, diz não )
Para atualizar o bloqueio ou basicamente aplicar alterações no json, você precisa usar o update e talvez não queira atualizar tudo. O bloqueio tem precedência para escolher o que deve ser instalado. Se houver um arquivo de bloqueio, é o que é usado. Você pode restringir a atualização um pouco, mas o sistema ainda está uma bagunça.
A atualização leva uma idade, shows de RAM. Eu também suspeito que, se você pegar um projeto que não foi tocado por um tempo, ele parecia a partir das versões anteriores, o que ocorrerá mais com o tempo e provavelmente não fará isso com eficiência, o que o estrangula.
Eles são muito sorrateiros quando se trata de ter comandos compostos secretos que você não poderia esperar ser composto. Por padrão, o comando de remoção do compositor aparece nos mapas para atualização do compositor e remoção do compositor, por exemplo.
A pergunta que você realmente precisa fazer não é se você deve manter o bloqueio em sua árvore de origem ou, alternativamente, se você deve persistir em algum lugar de alguma maneira ou não, mas sim se deve perguntar o que realmente faz, então você pode decidir por si mesmo quando você precisa persistir e onde.
Vou salientar que ter a capacidade de ter o bloqueio é uma grande conveniência quando você tem uma estratégia robusta de persistência de dependência externa, pois mantém o controle das informações úteis para rastrear essas (as origens) e atualizá-las, mas se você não tiver então não está aqui nem ali. Não é útil quando forçado na garganta como uma opção obrigatória para poluir suas árvores de origem. É uma coisa muito comum de se encontrar nas bases de código herdadas, onde as pessoas fizeram muitas alterações no compositer.json que realmente não foram aplicadas e estão quebradas quando as pessoas tentam usar o compositor. Sem compositer.lock, sem problema de dessincronização.