Composer használati tippek

A Composer egy függőségkezelő eszköz PHP-ban. Lehetővé teszi, hogy bejelentse, hogy a projektje mely könyvtáraktól függ, és a program telepíti és frissíti azokat Ön helyett. Megtanuljuk:

  • hogyan kell telepíteni a Composert
  • hogyan használjuk új vagy meglévő projektben

Telepítés

A Composer egy futtatható .phar fájl, amelyet az alábbiak szerint tölthet le és telepíthet.

Windows

Használja a Composer-Setup.exe hivatalos telepítő programot.

Linux, macOS

Mindössze 4 parancsra van szükséged, amelyeket erről az oldalról másolhatsz le.

Továbbá, a rendszerben található PATH mappába másolva a Composer globálisan elérhetővé válik:

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

Használat a projektben

A Composer projektben való használatának megkezdéséhez mindössze egy composer.json fájlra van szüksége. Ez a fájl leírja a projekt függőségeit, és egyéb metaadatokat is tartalmazhat. A legegyszerűbb composer.json így nézhet ki:

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

Itt azt mondjuk, hogy az alkalmazásunk (vagy könyvtárunk) függ a nette/database csomagtól (a csomag neve egy gyártó nevéből és a projekt nevéből áll), és azt a verziót szeretné, amelyik megfelel a ^3.0 verziókövetelménynek.

Tehát, amikor a composer.json fájl a projekt gyökerében van, és futtatjuk a:

composer update

Composer letölti a Nette adatbázist a vendor könyvtárba. Létrehoz egy composer.lock fájlt is, amely információt tartalmaz arról, hogy pontosan milyen könyvtárverziókat telepített.

A Composer létrehoz egy vendor/autoload.php fájlt. Ezt a fájlt egyszerűen beillesztheti, és minden további munka nélkül elkezdheti használni azokat az osztályokat, amelyeket ezek a könyvtárak biztosítanak:

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

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

Csomagok frissítése a legújabb verziókra

Az összes használt csomag frissítéséhez a composer.json pontban meghatározott verziókövetelményeknek megfelelően a composer update paranccsal frissítheti az összes használt csomagot a legújabb verzióra. Például a "nette/database": "^3.0" függőség esetében a parancs a legújabb, 3.x.x.x verziót fogja telepíteni, de a 4-es verziót nem.

A composer.json fájlban lévő verziókövetelmények frissítéséhez pl. "nette/database": "^4.1", a legújabb verzió telepítésének lehetővé tételéhez használja a composer require nette/database parancsot.

Az összes használt Nette csomag frissítéséhez az összeset fel kell sorolni a parancssorban, pl:

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

Ami nem praktikus. Ezért használjon egy egyszerű Composer Frontline szkriptet, amely megteszi ezt Ön helyett:

php composer-frontline.php

Új projekt létrehozása

Új Nette projekt egy egyszerű parancs végrehajtásával hozható létre:

composer create-project nette/web-project name-of-the-project

A name-of-the-project helyett meg kell adnia a projekt könyvtárának nevét, és végre kell hajtania a parancsot. A Composer le fogja hívni a nette/web-project tárolót a GitHubról, amely már tartalmazza a composer.json fájlt, és rögtön ezután telepíti magát a Nette keretrendszert. Már csak a temp/ és a log/ könyvtárak írási jogosultságainak ellenőrzése van hátra, és már mehet is.

Ha tudod, hogy a PHP melyik verzióján lesz a projekt, mindenképpen állítsd be.

PHP verzió

A Composer mindig a csomagok azon verzióit telepíti, amelyek kompatibilisek a PHP aktuálisan használt verziójával (vagy inkább a PHP-nak a parancssorban a Composer futtatásakor használt verziójával). Ami valószínűleg nem ugyanaz a verzió, mint amit a webtárhelye használ. Ezért nagyon fontos, hogy a composer.json fájlodhoz hozzáadj információt a tárhelyeden használt PHP verziójáról. Ezután csak a tárhelyével kompatibilis csomagok verziói fognak települni.

Például, ha a projektet a PHP 8.2.3-as verzióján szeretné futtatni, használja a következő parancsot:

composer config platform.php 8.2.3

Így íródik a verzió a composer.json fájlba:

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

A PHP verziószáma azonban a fájlban máshol is szerepel, a require szakaszban. Míg az első szám azt a verziót adja meg, amelyhez a csomagokat telepíteni kell, addig a második szám azt mondja meg, hogy maga az alkalmazás milyen verzióra íródott. (Természetesen nincs értelme, hogy ezek a verziók különbözőek legyenek, így a dupla bejegyzés csak redundancia.) Ezt a verziót a paranccsal állítjuk be:

composer require php 8.2.3 --no-update

Vagy közvetlenül a composer.json fájlban:

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

PHP verzió figyelmen kívül hagyása

A csomagok általában megadják a PHP legalacsonyabb verzióját, amellyel kompatibilisek, és a legmagasabb verzióját, amellyel tesztelték őket. Ha a PHP egy még újabb verzióját tervezi használni, esetleg tesztelési céllal, a Composer elutasítja az ilyen csomag telepítését. A megoldás a --ignore-platform-req=php+ opció használata, amelynek hatására a Composer figyelmen kívül hagyja a szükséges PHP-verzió felső határértékeit.

Hamis jelentések

A csomagok frissítésekor vagy a verziószámok megváltoztatásakor konfliktusok fordulnak elő. Az egyik csomagnak vannak olyan követelményei, amelyek ütköznek egy másikkal, és így tovább. A Composer azonban időnként hamis üzeneteket ír ki. Olyan konfliktust jelent, amely valójában nem létezik. Ebben az esetben segít, ha törli a composer.lock fájlt, és újra megpróbálja.

Ha a hibaüzenet továbbra is fennáll, akkor komolyan gondolja, és ki kell olvasni belőle, hogy mit és hogyan kell módosítani.

Packagist.org – Globális tárolóhely

Packagist a fő csomagtároló, amelyben a Composer megpróbál csomagokat keresni, ha másképp nem szólnak neki. Saját csomagjaidat is közzéteheted itt.

Mi van akkor, ha nem akarjuk a központi tárolót

Ha vannak olyan belső alkalmazásaink vagy könyvtáraink a vállalatunkban, amelyeket nem lehet nyilvánosan a Packagist-en hosztolni, akkor létrehozhatunk saját tárolókat az adott projekthez.

A tárolókról bővebben a hivatalos dokumentációban.

Automatikus betöltés

A Composer egyik legfontosabb jellemzője, hogy automatikus betöltést biztosít minden általa telepített osztály számára, amit a vendor/autoload.php fájl beillesztésével indíthat el.

Lehetőség van azonban arra is, hogy a Composer segítségével a vendor mappán kívül más osztályokat is betöltsön. Az első lehetőség, hogy a Composer átvizsgálja a meghatározott mappákat és almappákat, megkeresi az összes osztályt, és felveszi őket az automatikus betöltőbe. Ehhez állítsa be a autoload > classmap címet a composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      #  includes the src/ folder and its subfolders
		]
	}
}

Ezt követően minden egyes változtatásnál el kell indítani a composer dumpautoload parancsot, és hagyni kell, hogy az autoloading táblák újratermelődjenek. Ez rendkívül kényelmetlen, és sokkal jobb, ha ezt a feladatot a RobotLoaderre bízzuk, amely a háttérben automatikusan és sokkal gyorsabban végzi el ugyanezt a tevékenységet.

A második lehetőség a PSR-4 követése. Egyszerűen fogalmazva, ez egy olyan rendszer, ahol a névterek és az osztálynevek megfelelnek a könyvtárszerkezetnek és a fájlneveknek, azaz a App\Core\RouterFactory a /path/to/App/Core/RouterFactory.php fájlban található. Konfigurációs példa:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # the App\ namespace is in the app/ directory
		}
	}
}

Lásd a Composer dokumentációban, hogy pontosan hogyan kell konfigurálni ezt a viselkedést.

Új verziók tesztelése

Egy csomag új fejlesztői verzióját szeretné tesztelni. Hogyan kell ezt megtenni? Először is, add hozzá ezt az opciós párost a composer.json fájlhoz, amely lehetővé teszi a csomagok fejlesztői verzióinak telepítését, de csak akkor, ha nincs olyan stabil verzió-kombináció, amely megfelel a követelményeknek:

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

Javasoljuk a composer.lock fájl törlését is, mert néha a Composer érthetetlen módon megtagadja a telepítést, és ez megoldja a problémát.

Tegyük fel, hogy a csomag a nette/utils és az új verzió a 4.0. Telepítjük a következő paranccsal:

composer require nette/utils:4.0.x-dev

Vagy telepíthetsz egy adott verziót, például a 4.0.0-RC2-t:

composer require nette/utils:4.0.0-RC2

Ha egy másik csomag függ a könyvtártól, és egy régebbi verzióhoz van kötve (pl. ^3.1), akkor ideális frissíteni a csomagot, hogy az új verzióval működjön. Ha azonban csak meg akarja kerülni a korlátozást, és arra akarja kényszeríteni a Composert, hogy telepítse a fejlesztői verziót, és úgy tegyen, mintha az egy régebbi verzió lenne (pl. 3.1.6), akkor használhatja a as kulcsszót:

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

Parancsok hívása

Saját egyéni parancsait és szkriptjeit a Composeren keresztül úgy hívhatja meg, mintha azok natív Composer-parancsok lennének. A vendor/bin mappában található szkripteknek nem kell megadniuk ezt a mappát.

Példaként egy olyan szkriptet definiálunk a composer.json fájlban, amely a Nette Tester-t használja a tesztek futtatására:

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

Ezután a teszteket a composer tester segítségével futtatjuk. A parancsot akkor is meg tudjuk hívni, ha nem a projekt gyökérmappájában vagyunk, hanem egy alkönyvtárban.

Köszönet küldése

Mutatunk egy trükköt, aminek a nyílt forráskódú szerzők örülni fognak. A GitHubon könnyen adhatsz csillagot azoknak a könyvtáraknak, amelyeket a projekted használ. Csak telepítsd a symfony/thanks könyvtárat:

composer global require symfony/thanks

Majd futtasd le:

composer thanks

Próbáld ki!

Konfiguráció

A Composer szorosan integrálódik a Git verziókezelő eszközzel. Ha nem használja a Git-et, akkor ezt meg kell mondani a Composernek:

composer -g config preferred-install dist