Jestem trochę mylony z composer.lock
użyciem w aplikacji z repozytorium.
Widziałem wiele osób mówiących, że nie powinniśmy .gitignore
composer.lock
z repozytorium.
Jeśli zaktualizuję biblioteki w środowisku programistycznym, będę mieć nową, composer.lock
ale nie będę mógł zaktualizować ich do wersji produkcyjnej, prawda?
Czy to nie generuje konfliktów na tym pliku?
git
version-control
composer-php
Pierre de LESPINAY
źródło
źródło
Odpowiedzi:
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.
źródło
composer install
który przeczyta plik blokady i niczego nie zmieni.W przypadku aplikacji / projektów : zdecydowanie tak.
Dokumentacja kompozytora mówi o tym (z naciskiem):
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:
I stwierdza tutaj :
W przypadku bibliotek zgadzam się z odpowiedzią @Josh Johnson.
źródło
Po zrobieniu tego w obie strony dla kilku projektów, moje stanowisko jest takie, że
composer.lock
nie powinno się tego robić w ramach projektu.composer.lock
to 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.
źródło
composer.json
któ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 wcomposer.json
są inne niż zainstalowane zgodnie zcomposer.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 =)composer.json
. Wrequire
sekcji 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).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 update
wygeneruje 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.
źródło
Źródło: Kompozytor: Chodzi o plik blokady .
Źródło: Kompozytor - podstawowe użycie .
źródło
Jeśli obawiasz się łamania kodu, powinieneś zatwierdzić
composer.lock
system 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?
źródło
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ą.
źródło
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ą.
źródło