A group of composer (php dependency manager) logos

De onbekende Composer commando’s

Danny Techniek

Als je programmeert in PHP ben je vast bekend met Composer, en specifiek met de commando’s composer require vendor/package , composer install of composer update. Maar wist je dat er nog veel meer Composer commando’s zijn? In deze blogpost kijken we naar een aantal van deze relatief onbekende commando’s en ontdekken we dat sommige een goede toevoeging voor in de GitLab pipeline of GitHub Actions kunnen zijn.

Composer outdated

Het commando composer outdated geeft een output van alle geïnstalleerde packages en welke laatste versie er beschikbaar is. Door gebruik te maken van de opties --direct --no-dev --patch-only --locked, kan je een compleet overzicht ook terug brengen tot alleen de directe non-dev dependecies met een patch release op basis van de composer.lock file.

$ composer outdated
Color legend:
- patch or minor release available - update recommended
- major release available - update possible
doctrine/dbal 3.6.4 3.6.6 Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.
laravel/framework v9.52.10 v10.20.0 The Laravel Framework.

Composer audit

Met composer audit worden de geïnstalleerde dependencies gecontroleerd middels de Security Advisories van Packagist.org. Dit is vergelijkbaar met npm audit. Dit commando past goed bij de CI/CD pipeline om, in het geval van een vulnerability, de pipeline te laten falen zodat het fixen hiervan prioriteit krijgt.

Ook dit commando kent een --locked optie om te kijken naar wat er volgens de composer.lock verwacht wordt in plaats van wat er is geïnstalleerd in de vendor folder. Ook een --no-dev optie is aanwezig al wil je hier misschien geen gebruik van maken, afhankelijk hoe streng je wilt zijn in je project.

$ composer audit
Found 1 security vulnerability advisory affecting 1 package:
+-------------------+-------------------------------------------------------------+
| Package           | symfony/http-kernel                                         |
| CVE               | CVE-2022-24894                                              |
| Title             | CVE-2022-24894: Prevent storing cookie headers in HttpCache |
| URL               | https://symfony.com/cve-2022-24894                          |
| Affected versions | >=2.0.0,<2.1.0|>=2.1.0, ... ,<6.1.12|>=6.2.0,<6.2.6         |
| Reported at       | 2023-02-01T08:00:00+00:00                                   |
+-------------------+-------------------------------------------------------------+

Composer bump

Het composer bump commando is misschien wel de meest onbekende. Met dit commando worden de requirements in de composer.json bijgewerkt op basis van de huidige geïnstalleerde versie. Hiermee voorkom je dat er per ongeluk een downgrade van een package plaats vindt. Daarnaast heeft het een positief effect op de dependency tree resolution omdat er minder versies toegestaan zijn voor installatie en het aantal permutaties wordt beperkt.

$ composer bump
./composer.json has been updated (17 changes).

Composer depends

Met het composer depends commando kan je uitzoeken waarom een bepaalde package geïnstalleerd is. Reden hiervoor kunnen zijn dat je wilt weten waarom een package die naar voren komt met composer outdated of composer audit is geïnstalleerd.

$ composer depends json-mapper/json-mapper --tree
json-mapper/json-mapper 2.14.4 Map JSON structures to PHP classes
└──json-mapper/laravel-package 2.3.0 (requires json-mapper/json-mapper ^2.3)
   └──infi/infilytics dev-develop (requires json-mapper/laravel-package ^2.3)

Hierdoor kom je er snel achter dat infi/infilytics een package gebruikt welke een dependency heeft op JsonMapper.

Composer prohibits

Met het composer prohibits command kan je uitzoeken waarom je package niet geïnstalleerd kan worden. Dit kan komen door conflicten met andere packages of door ontbrekende platform constraints. De output geeft aan welke packages conflicteren zodat je gericht kan kijken naar een oplossing.

$ composer prohibits "json-mapper/json-mapper" "^1.0"
json-mapper/laravel-package 2.4.0       requires         json-mapper/json-mapper (^2.3)
json-mapper/json-mapper     1.4.2       requires         psr/log (^1.1)                            
infi/infilytics             dev-develop does not require psr/log (but 3.0.0 is installed)          
json-mapper/json-mapper     1.4.2       requires         psr/simple-cache (^1.0)                   
infi/infilytics             dev-develop does not require psr/simple-cache (but 3.0.0 is installed)

In dit geval kan json-mapper/json-mapper versie 1.x niet geïnstalleerd worden omdat de geïnstalleerde versie van json-mapper/laravel-package minimaal versie 2.3 nodig heeft.

Composer licenses

In het geval dat licenties belangrijk zijn in jouw project, in verband met closed source distributie of andere beperkingen, is er het commando composer licenses welke een lijst aan dependencies en hun licentie weergeeft.

$ composer licenses
...
json-mapper/json-mapper                2.19.0              MIT
json-mapper/laravel-package            2.4.0               MIT
laravel/framework                      v9.52.10            MIT
phpoption/phpoption                    1.9.1               Apache-2.0
phpunit/phpunit                        9.6.9               BSD-3-Clause
...

Composer clear-cache

In het geval dat er tijdens een composer install dingen gebeuren die anders zijn dan verwacht is er een commando dat je kan helpen. Met composer clear-cache wordt de lokale cache verwijderd en begin je met een schone lei.

$ composer clear-cache
Clearing cache (cache-vcs-dir): /Users/danny/Library/Caches/composer/vcs
Clearing cache (cache-repo-dir): /Users/danny/Library/Caches/composer/repo
Clearing cache (cache-files-dir): /Users/danny/Library/Caches/composer/files
Clearing cache (cache-dir): /Users/danny/Library/Caches/composer
All caches cleared.

Dit commando ruimt ook eventuele packages op die je niet langer in bezit kan of mag hebben. Bij Infi kan dit het geval zijn als je van project wisselt en je wilt alle code van het vorige project verwijderen van je computer.

Afsluitend

Zoals je hier hebt kunnen lezen zijn er meer Composer commando’s dan de composer install en composer require die minder bekend zijn maar zeker niet nutteloos.

Zo kunnen composer outdated en composer audit eenvoudig toegevoegd worden aan een GitLab CI/CD pipeline of een GitHub Actions. Mocht je besluiten om composer audit toe te voegen zet dan ook even een scheduled run aan van je pipeline voor de vroege ochtend, eventuele vulnerabilities zijn dan gelijk ‘s ochtends nog voor de stand up bekend.

Meer over PHP en Open Source....

Een afspraak maken bij ons op kantoor of wil je even iemand spreken? Stuur ons een mail of bel met Jolanda.