veilletech.fr
16 sept. Feed du jour
#07 COMPOSER Article

Laravel Vet relit Composer avant l'installation

Faire confiance à Packagist, c'est déléguer la relecture à personne.

Laravel Vet est un greffon Composer officiel qui affiche le code que composer update s'apprête à écrire dans vendor/, paquet par paquet, et enregistre les paquets approuvés dans un fichier vet.json à committer. Il peut déléguer la lecture à l'agent de code installé localement, qui rend un verdict PASS, FAIL, WARN ou SKIP. Un paquet non approuvé fait sortir la commande en erreur, ce qui casse le build tant que personne n'a regardé.

3 min de lectureintermédiairevidéo 1:13
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Comment s'y prendre
  3. L'agent lit à votre place
  4. Ce que retient vet.json
  5. Ce que ça change dans la CI
  6. À retenir

Ce qui se passe

L'équipe Laravel publie Vet, un greffon Composer qui montre le code qu'un composer update s'apprête à écrire dans vendor/, avant qu'il ne l'écrive. L'idée est reprise de cargo vet, côté Rust : chaque mise à jour apporte du code que personne dans l'équipe n'a lu, et on ne peut pas tout auditer à la main.

Le paquet fonctionne avec n'importe quel projet doté d'un composer.json — Laravel, Symfony, WordPress, PHP nu — et demande PHP 8.4 ou plus.

Comment s'y prendre

Terminal
composer require laravel/vet --dev
./vendor/bin/vet --init
# INFO  Trusted [125] packages, and wrote [vet.json].

--init marque comme fiables les paquets déjà présents sur le disque, sans les relire : c'est une photo de l'existant, pas un audit. À partir de là, Vet compare les mises à jour à cette référence et bloque celles qui apportent du code non approuvé :

TEXT
❯ composer update
  to review (1)
  carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 ....... 2 files changed
  Packages: 1 to review, 124 trusted

  ERROR  [1] package is not trusted.

Lancer ./vendor/bin/vet dans un terminal affiche les diffs, paquet par paquet ; la barre d'espace sélectionne ce qu'on approuve, Entrée enregistre.

L'agent lit à votre place

C'est le parti pris du paquet : Vet transmet les changements à l'agent de code déjà installé sur la machine — Claude Code, Codex, Gemini, opencode — et affiche son verdict à côté de chaque paquet :

TEXT
 INFO  [claude] reviews [3] packages (58.1 KB).
acme/logger 1.2.0 → 2.0.0 ................ 12 files changed
│  FAIL   src/Ship.php reads .env and sends it to an unknown host
acme/tooling 4.1.0 → 4.2.0 ................ 8 files changed
│  WARN   the agent did not read [1] file, because it is too big
carbonphp/carbon-doctrine-types 3.1.0 → 3.2.0 ....... 2 files changed
│  PASS   the changes narrow two return types

Les PASS sont présélectionnés, et le verdict de l'agent ne modifie jamais vet.json tout seul : c'est votre validation qui écrit.

Ce que retient vet.json

JSON
{
    "schema": 4,
    "require": {
        "carbonphp/carbon-doctrine-types": {
            "version": "3.2.1",
            "hash": "tree-v2:0f158f3b909fc01e691ed5f5121186056232b049031e7d3a914676d49881ece5"
        }
    }
}

Le fichier se commite à côté de composer.json. Le hash couvre tous les fichiers du paquet : si une release est modifiée sans changer de numéro de version — le scénario même des attaques récentes sur les registres — l'empreinte ne correspond plus et la revue est redemandée.

Ce que ça change dans la CI

Vet sort en erreur quand un paquet n'est pas approuvé. Placée dans une intégration continue, la commande arrête la chaîne sur toute dépendance que personne n'a regardée : le contrôle cesse d'être un geste de bonne volonté individuelle pour devenir une condition de build.

Le paquet est en bêta ; son comportement peut encore évoluer avant la première version stable. Pour une couche complémentaire, Heimdall impose un âge minimum aux dépendances, de sorte qu'une release doit reposer quelques jours avant d'être installée.

À retenir

Vet ne promet pas de détecter une porte dérobée : il remet la relecture dans la boucle, au moment où le code arrive, et garde trace de ce qui a été vu. Le point le plus utile est le hash — il transforme « j'ai regardé la 3.2.0 » en une affirmation vérifiable sur le contenu exact du paquet.