Czy composer.lock powinien być zaangażowany w kontrolę wersji?

529

Jestem trochę mylony z composer.lockużyciem w aplikacji z repozytorium.

Widziałem wiele osób mówiących, że nie powinniśmy .gitignore composer.lockz repozytorium.

Jeśli zaktualizuję biblioteki w środowisku programistycznym, będę mieć nową, composer.lockale nie będę mógł zaktualizować ich do wersji produkcyjnej, prawda?

Czy to nie generuje konfliktów na tym pliku?

Pierre de LESPINAY
źródło
1
Ten link jest teraz martwy @markus
Kyrre

Odpowiedzi:

672

Jeśli zaktualizujesz swoje biblioteki lib, chcesz również zatwierdzić plik blokujący. Zasadniczo stwierdza, że ​​twój projekt jest zablokowany dla tych konkretnych wersji bibliotek, których używasz.

Jeśli zatwierdzisz zmiany, a ktoś pobierze kod i zaktualizuje zależności, plik blokujący powinien zostać niezmodyfikowany. Jeśli zostanie zmodyfikowany, oznacza to, że masz nową wersję czegoś.

Posiadanie go w repozytorium zapewnia, że ​​każdy programista używa tych samych wersji.

meza
źródło
5
Ok, ale wyobraź sobie, że jeśli zaktualizuję biblioteki ze środowiska produkcyjnego, composer.lock zostanie nadpisany, więc kolejne ściągnięcie z produkcji poprosi mnie o scalenie tego pliku ...
Pierre de LESPINAY
7
Jeśli plik composer.lock zostanie zmodyfikowany, musisz wypchnąć modyfikacje z powrotem do repozytorium. Jeśli chcesz powiązać oprogramowanie z podanymi wersjami bibliotek, zrób to jawnie w konfiguracji. W ten sposób zamek nigdy się nie zmieni. Pomyśl o pliku blokady jako wskaźniku problemu zarządzania zależnościami, który należy rozwiązać w taki czy inny sposób.
meza
360
W środowisku produkcyjnym nie powinieneś aktualizować swoich zależności, powinieneś uruchomić, composer installktóry przeczyta plik blokady i niczego nie zmieni.
Seldaek
112
„W produkcji nie powinieneś aktualizować swoich zależności” powinno być pisane wielkimi
literami
75
@ JoaquínL.Robles W PRODUKCJI NIE POWINIENEŚ AKTUALIZOWAĆ SWOICH ZALEŻNOŚCI! :)
Елин Й.
201

W przypadku aplikacji / projektów : zdecydowanie tak.

Dokumentacja kompozytora mówi o tym (z naciskiem):

Zatwierdź composer.lock aplikacji (wraz z composer.json) w kontroli wersji.

Jak powiedział @meza: Powinieneś zatwierdzić plik blokady, abyś ty i twoi współpracownicy pracowali nad tym samym zestawem wersji i zapobiegali powiedzeniom typu „Ale to działało na moim komputerze”. ;-)

W przypadku bibliotek : Prawdopodobnie nie.

Dokumentacja kompozytora zawiera uwagi na ten temat:

Uwaga: W przypadku bibliotek niekoniecznie zaleca się zatwierdzenie pliku blokady (...)

I stwierdza tutaj :

W swojej bibliotece możesz zatwierdzić plik composer.lock, jeśli chcesz. Może to pomóc zespołowi w testowaniu zawsze tych samych wersji zależności. Jednak ten plik blokady nie będzie miał wpływu na inne projekty od niego zależne. Ma to wpływ tylko na główny projekt.

W przypadku bibliotek zgadzam się z odpowiedzią @Josh Johnson.

Jeroen Fiege
źródło
Dlaczego projekty w pracy traktuje się inaczej niż „biblioteki”?
Josh Johnson
4
Być może użycie słowa „współpracownicy” było tutaj mylące, zmieniłem je na współpracowników. Główną różnicą jest „główny projekt” w porównaniu z biblioteką, w której główny projekt składa się z jednej lub więcej bibliotek i kodu do ich integracji. Podczas uruchamiania kompozytora z głównego projektu nie korzysta on z pliku composer.lock biblioteki, więc instaluje swoje zależności w najnowszej wersji. Myślę, że powinno to być podobne podczas testowania biblioteki.
Jeroen Fiege
2
Zatwierdzenie pliku blokującego z biblioteką jest prawdopodobnie dobrą rzeczą - plik blokujący dokumentuje, które wersje zależności zostały zainstalowane podczas uruchamiania pakietu testowego. Jest to szczególnie ważne w zespole, a zwłaszcza w środowiskach ciągłej integracji.
mindplay.dk
Nietrywialne konflikty mogą pojawić się podczas ponownej integracji w gałęziach pnia 2, które mają zainstalowane nowe pakiety za pośrednictwem kompozytora. Stało się teraz :)
g4b0
2
@tonix, mogę odpowiedzieć na to z pewnym autorytetem! Powodem, dla którego nie zatwierdzam composer.lock dla moich bibliotek jest to, że mój CI buduje master każdej nocy, bez względu na wszystko. Gwarantuje to, że jeśli którakolwiek z zależności biblioteki będzie miała problemy z aktualizacją, użytkownik biblioteki będzie miał problemy z CI. Działa dobrze!
Theodore R. Smith
86

Po zrobieniu tego w obie strony dla kilku projektów, moje stanowisko jest takie, że composer.locknie powinno się tego robić w ramach projektu.

composer.lockto metadane kompilacji, które nie są częścią projektu. Stan zależności powinien być kontrolowany przez sposób ich wersjonowania (ręcznie lub jako część procesu automatycznej kompilacji), a nie arbitralnie przez ostatniego programistę, aby je zaktualizować i zatwierdzić plik blokady.

Jeśli obawiasz się, że Twoje zależności zmieniają się między aktualizacjami kompozytora, nie masz pewności co do schematu wersjonowania. Wersje (1.0, 1.1, 1.2 itd.) Powinny być niezmienne i należy unikać symboli wieloznacznych „dev-” i „X. *” poza początkowym opracowaniem funkcji.

Zatwierdzenie pliku blokady jest regresją dla systemu zarządzania zależnościami, ponieważ wersja zależności powróciła do definicji domyślnej.

Ponadto, twój projekt nigdy nie powinien być przebudowywany lub jego zależności zależne w każdym środowisku, zwłaszcza prod. Twój wynik (tar, zip, phar, katalog itp.) Powinien być niezmienny i promowany w środowiskach bez zmian.

Josh Johnson
źródło
19
Zgoda. Wydaje mi się, że bardziej sensowne jest określenie wersji zależności, w composer.jsonktórych wymagane wersje są wyraźniej określone. Ale jeśli nie ustawisz określonych wersji, lepiej zatwierdzić composer.lock. To mylące, jeśli wersje określone w composer.jsonsą inne niż zainstalowane zgodnie z composer.lock. Zależy to również od aplikacji (wersja wewnętrzna lub ogólna) i jej cyklu deweloperskiego. Oczywiście dokumenty kompozytora mówią pogrubioną czcionką: „Zaangażuj aplikację composer.lock (wraz z composer.json) w kontrolę wersji” . Wybierz mądrze =)
Quinn Comendant
10
Po długich poszukiwaniach duszy zdecydowałem, że w tej kwestii dokumentacja kompozytora jest błędna :) Mam zasadę, że nie dodam wygenerowanego materiału do VCS; Umożliwiam proces kompilacji sobie z tym poradzić.
Josh Johnson
10
Czy kod utworzony przy użyciu biomechanicznych urządzeń do naciskania klawiszy nie jest „generowanym materiałem”? Nie jestem pewien, czy jest to solidne kryterium, na którym można oprzeć politykę. =)
Quinn Comendant
5
@borfast Wiem, że jestem trochę spóźniony na rozmowę, więc do tej pory mogłeś to zobaczyć, ale możesz podać skrót w composer.json. W requiresekcji można umieścić: "repo": "dev-master#2633721877cae79ad461f3ca06f3f77fb4fce02e". Spowoduje to 1) przejście do gałęzi, 2) pobranie tego skrótu, 3) jeśli skrót nie zostanie znaleziony w oddziale, jednak spowoduje pobranie nagłówka określonej gałęzi (w tym przypadku master).
CEPA
5
@CEPA - To dziwne. Spodziewałbym się, że zakończy się niepowodzeniem, jeśli nie uda się znaleźć skrótu. Wydaje się niebezpieczne.
Nathan JB,
31
  1. Nie powinieneś aktualizować swoich zależności bezpośrednio od produkcji.
  2. Powinieneś kontrolować wersję swojego pliku composer.lock .
  3. Nie powinieneś kontrolować wersji swoich rzeczywistych zależności.

1. Nie powinieneś aktualizować swoich zależności bezpośrednio od Produkcji , ponieważ nie wiesz, jak wpłynie to na stabilność twojego kodu. Mogą być wprowadzane błędy z nowymi zależnościami, może to zmienić sposób, w jaki kod zachowuje się, wpływając na własne, może być niekompatybilny z innymi zależnościami itp. Powinieneś to zrobić w środowisku deweloperskim, po przeprowadzeniu odpowiedniej kontroli jakości i testów regresji itp. .

2. Powinieneś kontrolować wersję swojego pliku composer.lock , ponieważ przechowuje on informacje o twoich zależnościach i zależnościach zależności, które pozwolą ci zreplikować bieżący stan kodu. Jest to ważne, ponieważ wszystkie testy i prace programistyczne zostały wykonane w odniesieniu do określonego kodu. Nie dbanie o rzeczywistą wersję posiadanego kodu jest podobne do przesyłania zmian kodu do aplikacji i nie testowania ich. Jeśli aktualizujesz swoje wersje zależności, powinno to być dobrowolne i powinieneś zadbać o to, aby wszystko nadal działało. Utrata jednej lub dwóch godzin powrotu do poprzedniej wersji może kosztować dużo pieniędzy.

Jednym z argumentów, które zobaczysz na temat niepotrzebowania pliku composer.lock, jest to, że możesz ustawić dokładną wersję, której potrzebujesz w pliku composer.json , i że w ten sposób, za każdym razem, gdy ktoś uruchomi composer install, zainstaluje go tak samo kod. To nie jest prawda, ponieważ twoje zależności mają swoje własne zależności, a ich konfiguracja może być określona w formacie, który pozwala na aktualizację subwersji, a może nawet całych wersji.

Oznacza to, że nawet jeśli określisz, że chcesz Laravel 4.1.31 w pliku composer.json , Laravel w pliku composer.json może mieć swoje własne zależności wymagane jako dyspozytor zdarzeń Symfony: 2. *. Z tego rodzaju konfiguracją możesz skończyć z Laravel 4.1.31 z Symfony dispatcher zdarzeń 2.4.1, a ktoś inny w twoim zespole może mieć Laravel 4.1.31 z dispatcherem zdarzeń 2.6.5, wszystko zależy od tego, kiedy był ostatni raz, gdy uruchomiłeś instalację kompozytora.

Tak więc posiadanie pliku composer.lock w systemie wersji zapisze dokładną wersję tych zależności zależnych, więc kiedy ty i twój kolega z zespołu wykonacie instalację kompozytora (w ten sposób zainstalujecie swoje zależności w oparciu o kompozytora. blokada ) oboje otrzymacie te same wersje.

Co jeśli chcesz zaktualizować? Następnie uruchom środowisko deweloperskie: composer updatewygeneruje nowy plik composer.lock (jeśli jest coś nowego) i po jego przetestowaniu oraz testowi jakości i regresji przetestujesz go i tak dalej. Możesz pchnąć go, aby wszyscy inni pobrali nowy plik composer.lock , ponieważ można go bezpiecznie aktualizować.

3. Nie powinieneś kontrolować wersji swoich rzeczywistych zależności , ponieważ nie ma to sensu. Za pomocą composer.lock możesz zainstalować dokładną wersję zależności i nie musisz ich zatwierdzać. Po co dodawać do repo 10000 plików zależności, skoro nie należy ich aktualizować? Jeśli potrzebujesz zmienić jedną z tych opcji, powinieneś ją rozwidlić i wprowadzić tam zmiany. A jeśli martwisz się koniecznością pobierania rzeczywistych zależności za każdym razem, gdy kompilacja lub wydanie jest dostępne, kompozytor ma różne sposoby na złagodzenie tego problemu, pamięć podręczną, pliki zip itp.

lebobbi
źródło
1
Dzięki, myślę, że ta odpowiedź wyjaśnia, dlaczego powinieneś wersji composer.lock, a jeśli nie, jakie są konsekwencje i czy możesz z nimi żyć.
José Lozano Hernandez
8

Następnie zatwierdzasz composer.jsonprojekt i wszyscy inni członkowie zespołu mogą uruchomić instalację kompozytora, aby zainstalować zależności projektu.

Celem pliku blokady jest zapisanie dokładnie zainstalowanych wersji, aby można je było ponownie zainstalować. Oznacza to, że jeśli masz wersję specyfikacji 1. *, a Twój współpracownik uruchamia aktualizację kompozytora, która instaluje 1.2.4, a następnie zatwierdza plik composer.lock, po zainstalowaniu kompozytora otrzymasz również wersję 1.2.4, nawet jeśli 1.3.0 zostało wydane. Dzięki temu wszyscy pracujący nad projektem mają tę samą dokładną wersję.

Oznacza to, że jeśli coś zostało popełnione od ostatniej instalacji kompozytora, wówczas bez pliku blokady otrzymasz nowy kod innej firmy .

Ponownie jest to problem, jeśli martwisz się o złamanie kodu. Jest to jeden z powodów, dla których ważne jest, aby myśleć o Kompozytorze jako o środku wokół pliku composer.lock.

Źródło: Kompozytor: Chodzi o plik blokady .


Zatwierdź composer.lock aplikacji (wraz z composer.json) w kontroli wersji. Jest to ważne, ponieważ polecenie instalacji sprawdza, czy plik blokady jest obecny, a jeśli tak, pobiera określone tam wersje (niezależnie od tego, co mówi composer.json). Oznacza to, że każdy, kto konfiguruje projekt, pobierze dokładnie tę samą wersję zależności. Twój serwer CI, maszyny produkcyjne, inni programiści w twoim zespole, wszystko i wszyscy działają na tych samych zależnościach, co zmniejsza ryzyko błędów wpływających tylko na niektóre części wdrożeń. Nawet jeśli rozwijasz się sam, w ciągu sześciu miesięcy podczas ponownej instalacji projektu możesz mieć pewność, że zainstalowane zależności nadal działają, nawet jeśli od tego czasu wydałeś wiele nowych wersji.

Źródło: Kompozytor - podstawowe użycie .

Wandery
źródło
1

Jeśli obawiasz się łamania kodu, powinieneś zatwierdzić composer.locksystem kontroli wersji, aby upewnić się, że wszyscy współpracownicy projektu korzystają z tej samej wersji kodu. Bez pliku blokady za każdym razem będziesz otrzymywać nowy kod innej firmy.

Wyjątkiem jest sytuacja, gdy korzystasz z aplikacji meta, bibliotek, w których zależności powinny być aktualizowane podczas instalacji (np. Zend Framework 2 Skeleton App ). Dlatego celem jest pobranie najnowszych zależności za każdym razem, gdy chcesz zacząć rozwijać.

Źródło: Kompozytor: Chodzi o plik blokady

Zobacz także: Jakie są różnice między aktualizacją kompozytora a instalacją kompozytora?

kenorb
źródło
1

Nie ma na to dokładnej odpowiedzi.

Ogólnie rzecz biorąc, kompozytor nie powinien robić tego, co powinien robić system kompilacji i nie powinieneś umieszczać pliku composer.lock w VCS. Kompozytor może dziwnie mieć to do tyłu. Użytkownicy końcowi zamiast produkować nie powinni używać plików blokujących. Zwykle system kompilacji przechowuje za każdym razem migawki, katalogi wielokrotnego użytku itp. Zamiast pustego katalogu. Ludzie pobierający bibliotekę lib od kompozytora mogą chcieć, aby ta biblioteka korzystała z blokady, aby przetestować zależności, na które ładowane są biblioteki lib.

Z drugiej strony, co znacznie zwiększa obciążenie związane z zarządzaniem wersjami, gdzie prawie na pewno chcesz wielu wersji każdej biblioteki, ponieważ zależności będą ściśle zablokowane. Jeśli każda biblioteka prawdopodobnie będzie miała nieco inną wersję, potrzebujesz obsługi wielu wersji biblioteki i możesz szybko zobaczyć rozmiar potrzebnych zależności, dlatego radzę, aby pozostać na liście.

Biorąc to pod uwagę, naprawdę nie uważam, aby pliki blokujące były przydatne w bibliotekach lub w twoich katalogach roboczych. Używam go wyłącznie na mojej platformie kompilacji / testowania, która utrzymuje wszelkie zasoby pozyskane zewnętrznie, aktualizując je tylko na żądanie, zapewniając powtarzalne kompilacje do testowania, kompilacji i wdrażania. Chociaż można to zachować w VCS, nie zawsze jest ono przechowywane z drzewem źródłowym, drzewa kompilacji będą albo w innym miejscu w strukturze VCS, albo będą zarządzane przez inny system gdzieś indziej. Jeśli jest przechowywany w VCS, można dyskutować, czy zachować go w tym samym repozytorium co drzewa źródłowe, ponieważ w przeciwnym razie każde ściągnięcie może przynieść masę zasobów do kompilacji. Bardzo lubię mieć wszystko w dobrze zaaranżowanym repozytorium, z wyjątkiem poświadczeń produkcyjnych i wrażliwych oraz wzdęć.

SVN może to zrobić lepiej niż git, ponieważ nie zmusza cię do przejęcia całego repo (choć podejrzewam, że tak naprawdę nie jest to absolutnie potrzebne dla git, ale obsługa tego jest ograniczona i nie jest powszechnie używana). Proste repozytorium kompilacji to zwykle tylko gałąź nakładki, do której scalasz / eksportujesz drzewo kompilacji. Niektóre osoby łączą zasoby zewnętrzne w swoim drzewie źródłowym lub oddzielają dalej zewnętrzne, kompilacyjne i źródłowe drzewa. Zwykle służy dwóm celom, buforowaniu kompilacji i powtarzalnym kompilacjom, ale czasami utrzymanie go osobno na przynajmniej pewnym poziomie pozwala również na łatwe budowanie nowych / pustych i wielu kompilacji.

Jest na to wiele strategii i żadna z nich nie działa szczególnie dobrze z utrzymywaniem listy źródeł, chyba że trzymasz źródło zewnętrzne w drzewie źródeł.

Mają też takie rzeczy jak skróty w pliku, jak to się łączy, gdy dwie osoby aktualizują pakiety? Już samo to powinno sprawić, że pomyślisz, że to może być źle zrozumiane.

Argumenty, które ludzie przedstawiają dla plików blokujących, to przypadki, w których przyjęli bardzo konkretny i restrykcyjny pogląd na problem. Chcesz powtarzalne i spójne wersje? Dołącz folder dostawcy do VCS. Następnie przyspieszasz pobieranie zasobów, a także nie musisz polegać na potencjalnie uszkodzonych zasobach zewnętrznych podczas kompilacji. Żaden z tworzonych i wdrażanych potoków nie wymaga dostępu zewnętrznego, chyba że jest to absolutnie konieczne. Jeśli musisz zaktualizować zasób zewnętrzny, jest to tylko raz. To, co kompozytor próbuje osiągnąć, ma sens dla systemu rozproszonego, z wyjątkiem tego, co wspomniano wcześniej, nie ma sensu, ponieważ skończyłoby się piekłem zależnym od biblioteki dla aktualizacji biblioteki z typowymi konfliktami i aktualizacjami tak powolnymi, jak najwolniejszy do aktualizacji pakiet.

Dodatkowo dokonuję szybkiej aktualizacji. Za każdym razem, gdy się rozwijam, aktualizuję i testuję wszystko. Jest bardzo małe okno, w którym może się zakraść znaczący dryf wersji. Również realistycznie, gdy utrzymywana jest wersja semantyczna, co zwykle jest dla kompozytora, nie należy przypuszczać, że ma tyle problemów ze zgodnością lub zepsucia.

W composer.json umieścisz wymagane pakiety i ich wersje. Możesz zablokować tam wersje. Jednak te pakiety mają również zależności z wersjami dynamicznymi, które nie będą blokowane przez composer.json (chociaż nie rozumiem, dlaczego nie możesz ich tam umieścić sam, jeśli chcesz, aby były one zablokowane), więc ktoś, kto uruchamia kompozytora, instaluje dostaje coś innego bez blokady. Nie zależy ci na tym zbyt wiele lub może cię to obchodzić, to zależy. Czy powinno cię to obchodzić? Prawdopodobnie przynajmniej trochę, by upewnić się, że zdajesz sobie z tego sprawę w każdej sytuacji i potencjalnym wpływie, ale może to nie stanowić problemu, jeśli zawsze masz czas, aby po prostu DRY uruchomić najpierw i naprawić wszystko, co zostało zaktualizowane.

Trudny kompozytor stara się czasem uniknąć, po prostu go nie ma, a kłopot związany z blokowaniem plików kompozytora jest znaczący. Nie mają absolutnie żadnego prawa do informowania użytkowników, co powinni robić, a czego nie powinni robić, w odniesieniu do zasobów kompilacyjnych i źródłowych (czy dołączyć do oddzielnych w VCS), ponieważ to nie jest ich sprawa, nie są szefem ciebie ani mnie. „Kompozytor mówi” nie jest autorytetem, nie jest twoim przełożonym ani nie daje nikomu żadnej przewagi w tym zakresie. Tylko Ty znasz swoją prawdziwą sytuację i co jest dla niej najlepsze. Mogą jednak zalecić domyślny sposób postępowania dla użytkowników, którzy nie rozumieją, jak działają rzeczy, w którym to przypadku możesz postąpić zgodnie z tym, ale osobiście nie sądzę, że „ jest prawdziwym substytutem wiedzy o tym, jak działają rzeczy i możliwości prawidłowego ćwiczenia wymagań. Ostatecznie ich odpowiedź na to pytanie jest najlepsza. Ludzie, którzy tworzą kompozytora, nie wiedzą, gdzie powinieneś przechowywać swojego kompozytora.lock, i nie powinni. Ich jedynym obowiązkiem jest powiedzieć ci, co to jest i co robi. Poza tym musisz zdecydować, co jest dla Ciebie najlepsze.

Utrzymywanie pliku blokady jest problematyczne dla użyteczności, ponieważ kompozytor jest bardzo skryty, czy używa blokady, czy JSON i nie zawsze dobrze jest używać obu razem. Jeśli uruchomisz instalację, użyje tylko pliku blokady, więc pojawi się, więc jeśli dodasz coś do pliku composer.json, to nie zostanie on zainstalowany, ponieważ nie ma go w twojej blokadzie. Nie jest wcale intuicyjne, jakie operacje naprawdę robią i co robią w odniesieniu do pliku json / lock, a czasem nawet nie wydają się mieć sensu (pomoc mówi, że install pobiera nazwę pakietu, ale przy próbie użycia go mówi nie ).

Aby zaktualizować blokadę lub zasadniczo zastosować zmiany z JSON, musisz użyć aktualizacji i możesz nie chcieć aktualizować wszystkiego. Blokada ma pierwszeństwo przy wyborze tego, co powinno zostać zainstalowane. Jeśli istnieje plik blokady, jest on używany. Możesz nieco ograniczyć aktualizację, ale system wciąż jest bałaganem.

Aktualizacja zajmuje wieki, mnóstwo pamięci RAM. Podejrzewam również, że jeśli wybierzesz projekt, który nie był dotykany przez jakiś czas, że wyglądał na podstawie jego wersji, których będzie więcej w miarę upływu czasu i prawdopodobnie nie robi tego skutecznie, co tylko go dusi.

Są bardzo podstępni, jeśli chodzi o tajne złożone polecenia, których nie można oczekiwać. Domyślnie polecenie usuwania kompozytora pojawia się na mapach do aktualizacji kompozytora i na przykład usuwania kompozytora.

Pytanie, które naprawdę musisz zadać, nie dotyczy tego, czy powinieneś zachować blokadę w swoim drzewie źródłowym, czy też powinieneś zachować ją gdzieś w jakiś sposób, czy nie, ale raczej powinieneś zapytać, co faktycznie robi, to możesz sam zdecydować kiedy musisz to utrwalić i gdzie.

Zwrócę uwagę, że posiadanie blokady jest wielką wygodą, gdy masz solidną zewnętrzną strategię trwałości zależności, ponieważ śledzi ona informacje przydatne do śledzenia (pochodzenia) i aktualizacji, ale jeśli nie to nie ma go tu ani nie ma. Nie jest to przydatne, gdy jest zmuszane do gardła jako obowiązkowa opcja, aby zanieczyścić drzewa źródłowe. Bardzo powszechną rzeczą jest znajdowanie w starszych kodach, w których ludzie wprowadzili wiele zmian w composer.json, które tak naprawdę nie zostały zastosowane i są zepsute, gdy ludzie próbują użyć kompozytora. Bez pliku composer.lock, bez problemu z desynchronizacją.

jgmjgm
źródło
0

Tak, oczywiście.

Jest tak, ponieważ lokalnie zainstalowany kompozytor da pierwszeństwo plikowi composer.lock nad plikiem composer.json.

Jeśli plik blokady nie jest dostępny w vcs, kompozytor wskaże plik composer.json, aby zainstalować najnowsze zależności lub wersje.

Plik composer.lock utrzymuje zależność bardziej szczegółowo, tzn. Wskazuje na faktyczne zatwierdzenie wersji pakietu, którą zawarliśmy w naszym oprogramowaniu, dlatego jest to jeden z najważniejszych plików, który lepiej radzi sobie z zależnością.

Dinesh Suthar
źródło