Sfaturi pentru utilizarea Composer

Composer este un instrument pentru gestionarea dependențelor în PHP. Vă permite să declarați bibliotecile de care depinde proiectul dumneavoastră, iar acesta le va instala și actualiza pentru dumneavoastră. Vom învăța:

  • cum să instalăm Composer
  • cum să-l folosim într-un proiect nou sau existent

Instalare

Composer este un fișier executabil .phar pe care îl descărcați și îl instalați după cum urmează.

Windows

Utilizați programul de instalare oficial Composer-Setup.exe.

Linux, macOS

Aveți nevoie doar de 4 comenzi, pe care le puteți copia de pe această pagină.

Mai mult, prin copierea în folderul care se află în sistemul PATH, Composer devine accesibil la nivel global:

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

Utilizare în proiect

Pentru a începe să utilizați Composer în proiectul dumneavoastră, tot ce aveți nevoie este un fișier composer.json. Acest fișier descrie dependențele proiectului dumneavoastră și poate conține și alte metadate. Cel mai simplu composer.json poate arăta astfel:

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

Spunem aici că aplicația noastră (sau biblioteca) depinde de pachetul nette/database (numele pachetului este format din numele furnizorului și numele proiectului) și că dorește versiunea care corespunde constrângerii de versiune ^3.0.

Astfel, atunci când avem fișierul composer.json în rădăcina proiectului și executăm:

composer update

Composer va descărca baza de date Nette în directorul vendor. De asemenea, creează un fișier composer.lock, care conține informații despre versiunile exacte ale bibliotecilor pe care le-a instalat.

Composer generează un fișier vendor/autoload.php. Puteți include pur și simplu acest fișier și puteți începe să utilizați clasele pe care aceste biblioteci le furnizează fără nicio muncă suplimentară:

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

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

Actualizarea pachetelor la cele mai recente versiuni

Pentru a actualiza toate pachetele utilizate la cea mai recentă versiune în conformitate cu constrângerile de versiune definite în composer.json, utilizați comanda composer update. De exemplu, pentru dependența "nette/database": "^3.0", se va instala cea mai recentă versiune 3.x.x, dar nu și versiunea 4.

Pentru a actualiza constrângerile de versiune din fișierul composer.json la, de exemplu, "nette/database": "^4.1", pentru a permite instalarea celei mai recente versiuni, 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 nu este practic. Prin urmare, utilizați un script simplu Composer Frontline care va face acest lucru pentru dumneavoastră:

php composer-frontline.php

Crearea unui nou proiect

Un nou proiect Nette poate fi creat prin executarea unei comenzi simple:

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

În loc de name-of-the-project trebuie să furnizați numele directorului pentru proiectul dumneavoastră și să executați comanda. Composer va prelua depozitul nette/web-project de pe GitHub, care conține deja fișierul composer.json, și imediat după aceea va instala chiar Nette Framework. Singurul lucru care rămâne este să verificați permisiunile de scriere pe directoarele temp/ și log/ și sunteți gata de plecare.

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

Versiunea PHP

Composer instalează întotdeauna versiunile de pachete care sunt compatibile cu versiunea de PHP pe care o folosiți în prezent (sau, mai degrabă, versiunea de PHP utilizată în linia de comandă atunci când executați Composer). Care, probabil, nu este aceeași versiune pe care o folosește gazda dvs. web. De aceea, este foarte important să adăugați informații despre versiunea PHP de pe gazda dumneavoastră în fișierul composer.json. După aceea, vor fi instalate numai versiunile de pachete compatibile cu gazda.

De exemplu, pentru a seta proiectul să ruleze pe PHP 8.2.3, utilizați comanda:

composer config platform.php 8.2.3

În acest fel, versiunea este scrisă în fișierul composer.json:

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

Cu toate acestea, numărul versiunii PHP este, de asemenea, listat în altă parte în fișier, în secțiunea require. În timp ce primul număr specifică versiunea pentru care vor fi instalate pachetele, al doilea număr indică versiunea pentru care este scrisă aplicația în sine. (Desigur, nu are sens ca aceste versiuni să fie diferite, așa că dubla înscriere este o redundanță). Setați această versiune cu ajutorul comenzii:

composer require php 8.2.3 --no-update

Sau direct în fișierul composer.json:

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

Ignorarea versiunii PHP

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

Rapoarte false

La actualizarea pachetelor sau la schimbarea numerelor de versiune, apar conflicte. Un pachet are cerințe care intră în conflict cu un alt pachet și așa mai departe. Cu toate acestea, Composer tipărește ocazional un mesaj fals. Acesta raportează un conflict care nu există cu adevărat. În acest caz, este util să ștergeți fișierul composer.lock și să încercați din nou.

Dacă mesajul de eroare persistă, atunci acesta are o intenție serioasă și trebuie să citiți din el ce trebuie să modificați și cum.

Packagist.org – Depozitul global

Packagist este principalul depozit de pachete, în care Composer încearcă să caute pachete, dacă nu i se spune altfel. De asemenea, puteți publica propriile pachete aici.

Ce se întâmplă dacă nu dorim depozitul central

Dacă avem aplicații sau biblioteci interne în cadrul companiei noastre, care nu pot fi găzduite public pe Packagist, putem crea propriile noastre depozite pentru aceste proiecte.

Mai multe despre depozite în documentația oficială.

Încărcare automată

O caracteristică cheie a Composer este că oferă încărcare automată pentru toate clasele pe care le instalează, pe care o începeți prin includerea unui fișier vendor/autoload.php.

Cu toate acestea, este de asemenea posibil să utilizați Composer pentru a încărca alte clase în afara dosarului vendor. Prima opțiune este de a lăsa Composer să scaneze dosarele și subdosarele definite, să găsească toate clasele și să le includă în autoloader. Pentru a face acest lucru, setați autoload > classmap în composer.json:

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

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

A doua opțiune este să urmați PSR-4. Spunând simplu, este un sistem în care spațiile de nume și numele claselor corespund structurii directoarelor și numelor de fișiere, adică App\Core\RouterFactory se află în fișierul /path/to/App/Core/RouterFactory.php. Exemplu de configurare:

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

Consultați Documentația Composer pentru a afla exact cum se poate configura acest comportament.

Testarea noilor versiuni

Doriți să testați o nouă versiune de dezvoltare a unui pachet. Cum se face acest lucru? În primul rând, adăugați această pereche de opțiuni la fișierul composer.json, care vă va permite să instalați versiuni de dezvoltare ale pachetelor, dar va face acest lucru numai dacă nu există o combinație de versiuni stabile care să îndeplinească cerințele:

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

De asemenea, vă recomandăm să ștergeți fișierul composer.lock, deoarece uneori Composer refuză în mod incomprehensibil să instaleze, iar acest lucru va rezolva problema.

Să spunem că pachetul este nette/utils și că noua versiune este 4.0. Îl instalați cu ajutorul comenzii:

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

Dacă un alt pachet depinde de bibliotecă și este blocat la o versiune mai veche (de exemplu, ^3.1), este ideal să actualizați pachetul pentru a funcționa cu noua versiune. Cu toate acestea, dacă doriți doar să ocoliți limitarea și să forțați Composer să instaleze versiunea de dezvoltare și să pretindeți că este o versiune mai veche (de exemplu, 3.1.6), puteți utiliza cuvântul cheie as:

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

Comenzi de apelare

Puteți apela propriile comenzi și scripturi personalizate prin Composer ca și cum ar fi comenzi Composer native. Scripturile localizate în folderul vendor/bin nu trebuie să specificați acest folder.

Ca exemplu, definim un script în fișierul composer.json care utilizează Nette Tester pentru a rula teste:

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

Apoi executăm testele cu composer tester. Putem apela comanda chiar dacă nu ne aflăm în folderul rădăcină al proiectului, ci într-un subdirectoriu.

Trimiteți mulțumiri

Vă vom arăta un truc care îi va face fericiți pe autorii open source. Puteți să acordați cu ușurință o stea pe GitHub bibliotecilor pe care le folosește proiectul dumneavoastră. Trebuie doar să instalați biblioteca symfony/thanks:

composer global require symfony/thanks

Și apoi rulați:

composer thanks

Încearcă!

Configurație

Composer este strâns integrat cu instrumentul de control al versiunilor Git. Dacă nu folosiți Git, este necesar să o comunicați lui Composer:

composer -g config preferred-install dist