Cześć. W dzisiejszym wpisie sprawdzimy jak działa najnowsza wersja menadżera zależności composer w wersji 2.0.0-alpha1. Porównamy jak wygląda działanie, czas wykonywania zadania oraz zużycie pamięci RAM podczas operacji instalowania, aktualizowania oraz dodawania nowej biblioteki.
Projekt, na którym będziemy testować menadżera zbudowany jest z wykorzystaniem Symfony 4.2 i wymaga 36 bibliotek – tyle pozycji wpisanych jest w pliku composer.json. Po uwzględnieniu zależności wszystkich bibliotek mamy 128 paczek.
Szybsze pobieranie
Najbardziej wyczekiwaną i zarazem najbardziej zauważalną zmianą w drugiej wersji composera jest zmieniony workflow instalowania, dodawania, aktualizacji czy usuwania paczek, co ma znaczący wpływ na wydajność. W wersji 1.x menadżer pobiera i instaluje paczka po paczce, a w wersji 2.x menadżer najpierw pobiera paczki oraz ich meta dane a następnie po zakończeniu ściągania instaluje je. Wszystko to dzieje się równolegle. Dzięki takiemu zabiegowi całość działa o wiele szybciej. Zobaczmy poniższe logi, jak wyglądała proces instalowania:
composer 1.10.7
|
|
composer 2.0-alpha1
|
|
Test composer install
Przejdźmy zatem do pierwszego testu – composer install. Testy przeprowadziłem w kontenerze docker z PHP7.4 i synchronizacją mutagen przy użyciu pamięci podręcznej oraz bez niej. Każdy test wykonany został pięciokrotnie, a wyniki zostały uśrednione. Poniżej możemy zobaczyć wykres porównujący czasy instalacji bibliotek testowego projektu z wykorzystaniem composera w wersji 1.10.7 oraz 2.0-alpha1.
O ile czas z wykorzystaniem cache nie robi wrażenia, o tyle instalacja bez wykorzystania pamięci podręcznej już tak. Mamy tutaj prawie trzy krotne zmniejszenie czasu całej operacji! Jest też mała uwaga, zużycie pamięci wzrosło o około 35%, ale jest to nadal małe zapotrzebowanie pamięci.
Test composer update oraz composer require
Czas na aktualizacje biblioteki. W tej operacji, composer musi sprawdzić całe drzewo zależności, co w wersji pierwszej narzędzia zajmuje bardzo dużo czasu oraz pamięci. Biblioteka jest w najnowszej wersji, więc sprawdzony został jedynie czas przygotowania do pobierania. Samo ściąganie paczek odbywa się według flow opisanego w composer install.
Sprawdziłem również jak wygląda proces dodawania nowej biblioteki do projektu.
Tak jak w pierwszym teście, każdy przypadek sprawdziłem 5 razy, a wyniki zostały uśrednione.
Wydajność drugiej wersji menadżera zależności robi na prawdę duże wrażenie. Czasy zmniejszyły się kilkukrotnie, a zużycie pamięci – no cóż, wykres mówi wszystko.
Uruchomienie jako root wymaga potwierdzenia
Od wersji 2.0 composer wymaga potwierdzenia, jeżeli zostanie uruchomiony z konta roota. Jako, że biblioteka może za pomocą composera wykonać dowolny kod na maszynie użytkownika, jest to dobry krok w stronę bezpieczeństwa.
Dry-run
Kolejną nowością jest opcja –dry-run dla operacji usuwania (remove) oraz dodawania (require). Czy będzie mocno używana? Nie wiem, ale gdyby ktoś chciał to jest 😀
Nowy format metadanych repozytoriów
Wraz z wydaniem wersji drugiej menadżera, dodany został nowy format metadanych repozytoriów. Pierwsza wersja menadżera zależności pobierała ogromy plik JSON. Najnowszy format to zestaw małych plików JSON, które composer może pobrać i zapisać w cache.
Aby sprawdzić, czy dane repozytorium wspiera nowy format, wystarczy, że poszukamy klucza metadata-url
w pliku packages.json. Gdy tylko omawiany format jest dostępny, composer 2 będzie korzystał z nowych danych, a wersja pierwsza nadal będzie korzystać tylko ze starego formatu.
Najpopularniejsze repozytorium paczek Packagist.org
wspiera już nowy format.