Kompozytor: wskazówki dotyczące użytkowania

Composer to narzędzie do zarządzania zależnościami w PHP. Pozwoli nam ona na wypisanie bibliotek, od których zależy nasz projekt oraz zainstaluje i zaktualizuje je za nas. Zobaczymy:

  • jak zainstalować Composera
  • jak używać go w nowym lub istniejącym projekcie

Instalacja

Composer to plik wykonywalny .phar, który pobierasz i instalujesz w następujący sposób:

Windows

Użyj oficjalnego instalatora Composer-Setup.exe.

Linux, macOS

Wystarczy 4 polecenia, które kopiujesz z tej strony.

Następnie wklejenie go do folderu, który znajduje się w systemie PATH, sprawi, że Composer będzie dostępny globalnie:

$ mv ./composer.phar ~/bin/composer # nebo /usr/local/bin/composer

Zastosowanie w projekcie

Aby zacząć używać Composera w swoim projekcie, wszystko czego potrzebujesz to plik composer.json. Opisuje on zależności twojego projektu i może zawierać dodatkowe metadane. Zatem podstawowy composer.json może wyglądać tak:

{
	"require": {
		"nette/database": "^3.0"
	}
}

Mówimy tutaj, że nasza aplikacja (lub biblioteka) wymaga pakietu nette/database (nazwa pakietu składa się z nazwy organizacji i nazwy projektu) i chce wersji, która odpowiada warunkowi ^3.0 (tj. najnowszej wersji 3).

Mamy więc composer.json w korzeniu projektu i rozpoczynamy instalację:

composer update

Composer pobiera bazę danych Nette Database do folderu vendor/. Następnie tworzy plik composer.lock, który zawiera informacje o tym, jakie dokładnie wersje bibliotek zainstalował.

Composer wygeneruje plik vendor/autoload.php, który możemy po prostu zintegrować i zacząć korzystać z bibliotek bez dalszej pracy:

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

Aktualizacja pakietów do najnowszych wersji

Polecenie composer update jest odpowiedzialne za aktualizację używanych bibliotek do najnowszych wersji zgodnie z warunkami określonymi w composer.json. Na przykład dla zależności "nette/database": "^3.0" zainstaluje najnowszą wersję 3.x.x, ale już nie wersję 4.

Aby zaktualizować warunki w pliku composer.json do "nette/database": "^4.1", na przykład w celu zainstalowania najnowszej wersji, należy użyć polecenia composer require nette/database.

Aby zaktualizować wszystkie używane pakiety Nette, należałoby wymienić je wszystkie w linii poleceń, np:

composer require nette/application nette/forms latte/latte tracy/tracy ...

Co jest niepraktyczne. Użyj więc prostego skryptu Composer Frontline, aby zrobić to za Ciebie:

php composer-frontline.php

Utwórz nowy projekt

Nowy projekt w Nette można utworzyć za pomocą jednego polecenia:

composer create-project nette/web-project nazev-projektu

Wpisz nazwę katalogu dla swojego projektu jako nazev-projektu i zatwierdź. Composer pobiera z GitHuba repozytorium nette/web-project, które zawiera już composer.json, a następnie Nette Framework. Powinieneś tylko ustawić uprawnienia do zapisu na temp/ i log/ i twój projekt powinien ożyć.

Jeśli wiesz, na jakiej wersji PHP będzie hostowany projekt, koniecznie go skonfiguruj.

Wersja PHP

Composer zawsze instaluje wersje pakietów, które są kompatybilne z wersją PHP, której aktualnie używasz (lub raczej z wersją PHP używaną w linii poleceń, gdy uruchamiasz Composera). Co prawdopodobnie nie jest tą samą wersją, której używa Twój hosting. Dlatego bardzo ważne jest dodanie informacji o wersji PHP na Twoim hostingu do pliku composer.json. Następnie zostaną zainstalowane tylko wersje pakietów zgodne z hostem.

Na przykład, aby ustawić projekt tak, aby działał na PHP 8.2.3, użyj polecenia:

composer config platform.php 8.2.3

W ten sposób wersja jest zapisywana do pliku composer.json:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

Jednakże, numer wersji PHP jest również podany w innym miejscu pliku, w sekcji require. Podczas gdy pierwszy numer określa wersję, dla której zostaną zainstalowane pakiety, drugi mówi, dla jakiej wersji została napisana sama aplikacja. (Oczywiście nie ma sensu, aby te wersje były różne, więc podwójny wpis jest redundancją). Wersję tę ustawiasz poleceniem:

composer require php 8.2.3 --no-update

Lub bezpośrednio w pliku composer.json:

{
	"require": {
		"php": "8.2.3"
	}
}

Ignorowanie wersji PHP

Pakiety zazwyczaj określają zarówno najniższą wersję PHP, z którą są kompatybilne, jak i najwyższą wersję, z którą zostały przetestowane. Jeśli planujesz użyć jeszcze nowszej wersji PHP, być może w celach testowych, Composer odmówi instalacji takiego pakietu. Rozwiązaniem jest użycie opcji --ignore-platform-req=php+, która powoduje, że Composer ignoruje górne limity wymaganej wersji PHP.

Fałszywe raporty

Podczas aktualizacji pakietów lub zmiany numerów wersji zdarzają się konflikty. Jeden pakiet ma wymagania, które są sprzeczne z innym i tak dalej. Jednakże, Composer czasami drukuje fałszywe wiadomości. Zgłasza konflikt, który tak naprawdę nie istnieje. W takim przypadku pomaga usunięcie pliku composer.lock i ponowna próba.

Jeśli komunikat o błędzie utrzymuje się, to znaczy, że jest on poważny i trzeba z niego wyczytać, co i jak należy zmodyfikować.

Packagist.org – centralne repozytorium

Packagist jest centralnym repozytorium, w którym Composer próbuje znaleźć pakiety, chyba że powiemy mu inaczej. Możemy tu również opublikować własne pakiety.

Co jeśli nie chcemy korzystać z centralnego repozytorium?

Jeśli mamy wewnętrzne aplikacje, których po prostu nie możemy hostować publicznie, tworzymy dla nich firmowe repozytorium.

Zobacz oficjalną dokumentację, aby dowiedzieć się więcej o repozytoriach.

Autoloading

Kluczową cechą Composera jest to, że zapewnia on autoloading dla wszystkich swoich zainstalowanych klas, który rozpoczynasz poprzez włączenie pliku vendor/autoload.php.

Jednakże możliwe jest również użycie Composera do załadowania innych klas spoza folderu vendor. Pierwszą opcją jest zlecenie Composerowi przeszukania zdefiniowanych folderów i podfolderów, znalezienie wszystkich klas i włączenie ich do autoloadera. Odbywa się to poprzez ustawienie autoload > classmap w composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      #  zahrne složku src/ a její podsložky
		]
	}
}

Następnie musisz uruchomić polecenie composer dumpautoload za każdym razem, gdy dokonujesz zmiany i masz ponownie wygenerowane tabele autoloader. Jest to niezwykle uciążliwe i zdecydowanie lepiej powierzyć to zadanie RobotLoaderowi, który wykonuje tę samą pracę automatycznie w tle i znacznie szybciej.

Inną możliwością jest zastosowanie się do PSR-4. Mówiąc najprościej, jest to system, w którym przestrzenie nazw i nazwy klas odpowiadają strukturom katalogów i nazwom plików, więc na przykład App\Router\RouterFactory będzie w pliku /path/to/App/Router/RouterFactory.php. Przykładowa konfiguracja:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # jmenný prostor App\ je v adresáři app/
		}
	}
}

Zobacz dokumentację Composera, aby dowiedzieć się dokładnie, jak skonfigurować zachowanie.

Testowanie nowych wersji

Chcesz przetestować nową wersję rozwojową pakietu. Jak to zrobić? Po pierwsze, dodaj tę parę opcji do pliku composer.json, która pozwoli ci zainstalować wersje rozwojowe pakietów, ale będzie uciekać się do tego tylko wtedy, gdy nie ma kombinacji stabilnych wersji, które spełniają wymagania:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

Zaleca się również usunięcie pliku composer.lock, ponieważ czasami Composer niezrozumiale odmawia instalacji i to rozwiąże problem.

Załóżmy, że jest to pakiet nette/utils, a nowa wersja ma numer 4.0. Instalujesz go za pomocą polecenia:

composer require nette/utils:4.0.x-dev

Możesz też zainstalować konkretną wersję, na przykład 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Ale jeśli inny pakiet zależy od biblioteki i jest zablokowany do starszej wersji (np. ^3.1), idealnie jest zaktualizować pakiet, aby działał z nową wersją. Jeśli jednak chcesz po prostu obejść ograniczenie i zmusić Composera do zainstalowania wersji rozwojowej i udawania, że jest to starsza wersja (np. 3.1.6), możesz użyć słowa kluczowego as:

composer require nette/utils "4.0.x-dev as 3.1.6"

Wywoływanie poleceń

Możesz wywoływać własne, gotowe polecenia i skrypty poprzez Composera, tak jakby były one natywnymi poleceniami Composera. W przypadku skryptów, które znajdują się w folderze vendor/bin, nie ma potrzeby określania tego folderu.

Jako przykład zdefiniujmy w pliku composer.json skrypt, który uruchamia testy przy użyciu Nette Tester:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

Następnie możemy uruchomić testy za pomocą composer tester. Polecenie możemy wywołać nawet jeśli nie znajdujemy się w korzeniu projektu, ale w podkatalogu.

Wyślij podziękowania

Pokażemy Ci sztuczkę, która pozwoli Ci zadowolić autorów open source. Prosty sposób na rozgwiazdkowanie bibliotek, z których korzysta twój projekt na GitHubie. Wystarczy zainstalować bibliotekę symfony/thanks:

composer global require symfony/thanks

A potem go uruchomić:

composer thanks

Spróbuj!

Konfiguracja

Composer jest ściśle zintegrowany z narzędziem do wersjonowania Git. Jeśli nie masz go zainstalowanego, musisz powiedzieć Composerowi, aby go nie używał:

composer -g config preferred-install dist