Composer: sfaturi de utilizare

Composer este un instrument pentru gestionarea dependențelor în PHP. Ne permite să enumerăm bibliotecile de care depinde proiectul nostru și le va instala și actualiza pentru noi. Vom arăta:

  • cum se instalează Composer
  • utilizarea sa într-un proiect nou sau existent

Instalare

Composer este un fișier executabil .phar, pe care îl descărcați și instalați în felul următor:

Windows

Utilizați instalatorul oficial Composer-Setup.exe.

Linux, macOS

Sunt suficiente 4 comenzi, pe care le copiați de pe această pagină.

Apoi, prin plasarea în directorul care se află în PATH-ul sistemului, Composer devine accesibil global:

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

Utilizare în proiect

Pentru a putea începe să utilizați Composer în proiectul dvs., aveți nevoie doar de fișierul composer.json. Acesta descrie dependențele proiectului nostru și poate conține și alte metadate. Un composer.json de bază poate arăta deci astfel:

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

Spunem aici că aplicația noastră (sau biblioteca) necesită pachetul nette/database (numele pachetului este format din numele organizației și numele proiectului) și dorește o versiune care corespunde condiției ^3.0 (adică cea mai recentă versiune 3).

Avem deci în rădăcina proiectului fișierul composer.json și rulăm instalarea:

composer update

Composer va descărca Nette Database în directorul vendor/. Apoi va crea fișierul composer.lock, care conține informații despre ce versiuni exacte ale bibliotecilor a instalat.

Composer generează fișierul vendor/autoload.php, pe care îl putem include simplu și începe să folosim bibliotecile fără nicio altă muncă:

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

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

Actualizarea pachetelor la cele mai recente versiuni

Actualizarea bibliotecilor utilizate la cele mai recente versiuni conform condițiilor definite în composer.json este responsabilitatea comenzii composer update. De ex., pentru dependența "nette/database": "^3.0", va instala cea mai recentă versiune 3.x.x, dar nu și versiunea 4.

Pentru a actualiza condițiile din fișierul composer.json, de exemplu la "nette/database": "^4.1", pentru a putea instala cea mai recentă versiune, utilizați comanda composer require nette/database.

Pentru a actualiza toate pachetele Nette utilizate, ar fi necesar să le enumerați pe toate în linia de comandă, de ex.:

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

Ceea ce este nepractic. Utilizați, prin urmare, scriptul simplu Composer Frontline, care va face asta pentru dvs.:

php composer-frontline.php

Crearea unui proiect nou

Un proiect nou pe Nette îl creați folosind o singură comandă:

composer create-project nette/web-project nume-proiect

Ca nume-proiect introduceți numele directorului pentru proiectul dvs. și confirmați. Composer va descărca repository-ul nette/web-project de pe GitHub, care conține deja fișierul composer.json, și imediat după aceea Nette Framework. Ar trebui să fie suficient doar să setați permisiunile de scriere pentru directoarele temp/ și log/ și proiectul ar trebui să prindă viață.

Dacă știți pe ce versiune de PHP va fi găzduit proiectul, nu uitați să o setați.

Versiunea PHP

Composer instalează întotdeauna acele versiuni de pachete care sunt compatibile cu versiunea de PHP pe care o utilizați în prezent (mai precis, cu versiunea de PHP utilizată în linia de comandă la rularea Composerului). Ceea ce, însă, probabil nu este aceeași versiune pe care o utilizează găzduirea dvs. De aceea, este foarte important să adăugați în fișierul composer.json informații despre versiunea PHP de pe găzduire. Apoi se vor instala doar versiuni de pachete compatibile cu găzduirea.

Faptul că proiectul va rula, de exemplu, pe PHP 8.2.3, îl setăm cu comanda:

composer config platform.php 8.2.3

Astfel se va scrie versiunea în fișierul composer.json:

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

Cu toate acestea, numărul versiunii PHP se specifică și în alt loc al fișierului, și anume în secțiunea require. În timp ce primul număr specifică pentru ce versiune se vor instala pachetele, al doilea număr spune pentru ce versiune este scrisă aplicația însăși. Și conform acestuia, de exemplu, PhpStorm setează PHP language level. (Desigur, nu are sens ca aceste versiuni să difere, deci dubla scriere este o neglijență.) Această versiune o setați cu comanda:

composer require php 8.2.3 --no-update

Sau direct în fișierul composer.json:

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

Ignorarea versiunii PHP

Pachetele au de obicei specificată atât cea mai mică versiune de PHP cu care sunt compatibile, cât și cea mai mare cu care sunt testate. Dacă intenționați să utilizați o versiune de PHP și mai nouă, de exemplu din motive de testare, Composer va refuza să instaleze un astfel de pachet. Soluția este opțiunea --ignore-platform-req=php+, care face ca Composer să ignore limitele superioare ale versiunii PHP solicitate.

Mesaje false

La actualizarea pachetelor sau modificarea numerelor de versiuni, se întâmplă să apară conflicte. Un pachet are cerințe care sunt în contradicție cu altul și altele asemenea. Composer, însă, uneori afișează mesaje false. Raportează un conflict care în realitate nu există. În acest caz, ajută ștergerea fișierului composer.lock și încercarea din nou.

Dacă mesajul de eroare persistă, atunci este serios și trebuie să citiți din el ce și cum să modificați.

Packagist.org – repository central

Packagist este repository-ul principal în care Composer încearcă să caute pachete, dacă nu îi spunem altfel. Putem publica aici și propriile pachete.

Ce facem dacă nu vrem să folosim repository-ul central?

Dacă avem aplicații interne ale companiei, pe care pur și simplu nu le putem găzdui public, atunci ne creăm pentru ele un repository al companiei.

Mai multe despre subiectul repository-urilor în documentația oficială.

Autoloading

O caracteristică esențială a Composerului este că oferă autoloading pentru toate clasele instalate de el, pe care îl porniți prin includerea fișierului vendor/autoload.php.

Cu toate acestea, este posibil să utilizați Composer și pentru încărcarea altor clase și în afara directorului vendor. Prima opțiune este să lăsați Composer să caute în directoarele și subdirectoarele definite, să găsească toate clasele și să le includă în autoloader. Acest lucru se realizează prin setarea autoload > classmap în composer.json:

{
	"autoload": {
		"classmap": [
			"src/",      #  include directorul src/ și subdirectoarele sale
		]
	}
}

Ulterior, este necesar la fiecare modificare să rulați comanda composer dumpautoload și să lăsați tabelele de autoloading să se regenereze. Acest lucru este extrem de incomod și mult mai bine este să încredințați această sarcină RobotLoaderului, care efectuează aceeași activitate automat în fundal și mult mai rapid.

A doua opțiune este să respectați PSR-4. Simplificat spus, este vorba despre un sistem în care spațiile de nume și numele claselor corespund structurii directoarelor și numelor fișierelor, adică, de ex., App\Core\RouterFactory va fi în fișierul /path/to/App/Core/RouterFactory.php. Exemplu de configurare:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # spațiul de nume App\ este în directorul app/
		}
	}
}

Cum să configurați exact comportamentul veți afla în documentația Composerului.

Testarea versiunilor noi

Doriți să testați o nouă versiune de dezvoltare a unui pachet. Cum să faceți asta? Mai întâi, adăugați în fișierul composer.json această pereche de opțiuni, care permite instalarea versiunilor de dezvoltare ale pachetelor, însă recurge la aceasta doar în cazul în care nu există nicio combinație de versiuni stabile care să satisfacă cerințele:

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

Apoi, recomandăm ștergerea fișierului composer.lock, uneori Composer refuză inexplicabil instalarea și acest lucru rezolvă problema.

Să presupunem că este vorba despre pachetul nette/utils și noua versiune are numărul 4.0. O instalați cu comanda:

composer require nette/utils:4.0.x-dev

Sau puteți instala o versiune specifică, de exemplu 4.0.0-RC2:

composer require nette/utils:4.0.0-RC2

Dar dacă de bibliotecă depinde un alt pachet, care este blocat la o versiune mai veche (de ex. ^3.1), atunci este ideal să actualizați pachetul, pentru a funcționa cu noua versiune. Dacă însă doriți doar să ocoliți restricția și să forțați Composer să instaleze versiunea de dezvoltare și să pretindă că este o versiune mai veche (de ex. 3.1.6), puteți utiliza cuvântul cheie as:

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

Apelarea comenzilor

Prin Composer se pot apela comenzi și scripturi proprii pre-pregătite, ca și cum ar fi comenzi native ale Composerului. Pentru scripturile care se află în directorul vendor/bin, nu este necesar să specificați acest director.

Ca exemplu, definim în fișierul composer.json un script care, folosind Nette Tester, rulează testele:

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

Testele le rulăm apoi folosind composer tester. Comanda o putem apela și în cazul în care nu ne aflăm în directorul rădăcină al proiectului, ci într-un subdirector.

Trimiteți mulțumiri

Vă vom arăta un truc prin care veți bucura autorii de open source. Într-un mod simplu, dați o stea pe GitHub bibliotecilor pe care proiectul dvs. le utilizează. Este suficient să instalați biblioteca symfony/thanks:

composer global require symfony/thanks

Și apoi să rulați:

composer thanks

Încercați!

Configurare

Composer este strâns legat de instrumentul de versionare Git. Dacă nu îl aveți instalat, trebuie să îi spuneți Composerului să nu îl utilizeze:

composer -g config preferred-install dist