pnpm dev rejoue prisma generate à chaque démarrage : sur Windows il échoue en EPERM dès qu'une autre instance tient le moteur #24
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Le script
devd'apps/apienchaîneprisma generateavant de lancer le serveur. Sur Windows, le binaire du moteur de requête est verrouillé par tout processus Node qui l'a déjà chargé : relancerpnpm devpendant qu'une instance tourne échoue systématiquement, avec un message qui ne nomme jamais Prisma ni la cause.Reproduction
Dans un satellite, API déjà lancée dans un autre terminal :
Sortie :
Le script fautif,
apps/api/package.json:Ce que ça coûte
Non bloquant une fois qu'on sait — mais on ne le sait pas, et le message n'aide pas :
.dll.nodene dit pas « une autre instance tourne ». On cherche un problème de droits, un antivirus, unnode_modulescorrompu.git checkout, ou parce qu'un agent a redémarré la pile. La commande échoue, et l'API qui tourne encore laisse croire que tout va bien — jusqu'à ce qu'on cherche pourquoi le code modifié ne prend pas.dev:serveurutilisenode --watchsurdist/, etdev:typesrecompile en continu. Leprisma generateen tête n'est nécessaire qu'au premier démarrage, ou après un changement de schéma — pas à chaque lancement.Chez nous, ça a coûté deux redémarrages ratés dans la même session, dont un où j'ai cru avoir perdu le serveur alors qu'il tournait toujours.
Ce que je proposerais
Par ordre de préférence :
prisma generatedu scriptdevet le laisser où il est déjà : danspostinstall(il y est) et dans le script de migration. Le client Prisma est généré à l'installation et à chaque changement de schéma ; le régénérer à chaquedevne protège de rien quepostinstallne couvre pas déjà.prisma generate || truemasquerait l'échec mais garderait le bénéfice au premier lancement. Moins propre, mais une ligne.generateéchoue en EPERM sur Windows : « le moteur Prisma est verrouillé — une autre instance de l'API tourne probablement ; arrêtez-la, ou lancezdevsans régénérer ». Un message qui nomme sa cause vaut mieux qu'un message exact.Accessoirement, la même remarque vaut pour
db:schema(la copie deauth.prisma) : elle est idempotente et rapide, donc inoffensive — mais elle s'exécute elle aussi à chaque démarrage sans que ce soit nécessaire.Contournement posé chez nous
Aucun dans le dépôt. On relance à la main en tuant d'abord l'instance en cours, ce qui suppose de savoir qu'il faut le faire.
Versions
@eqs/cli,@eqs/auth,@eqs/testing: 0.8.1@prisma/client: 6.19.3pnpm@11.8.0, Node v24.15.0, Windows 11 Pro 26200apps/api/package.json, scriptdevTrouvé en développant le premier satellite réel (Atelier, ex-Pilotage), en relançant l'API après un renommage.
Vrai, et c'est votre option 1 — après avoir vérifié sa prémisse, qui tient.
Ce que j'ai vérifié
Le client est donc produit à l'installation et au build. Et
prisma migrate devrégénère de lui-même après une migration. Legeneratededevne couvrait rien que les trois autres ne couvrent déjà — il ne restait que son coût.Retiré.
db:schemareste : la copie d'auth.prismadepuis@eqs/authest idempotente, rapide, et c'est elle qui garde le schéma aligné sur le socle après une mise à jour. Votre remarque accessoire est juste, mais celle-là gagne son passage.Votre point 2 est le vrai
C'est ce qui fait la différence entre un agacement et un défaut. Relancer après un changement de variable, après un
git checkout, ou parce qu'un agent a redémarré la pile — et pendant ce temps l'API qui tourne encore laisse croire que tout va bien, jusqu'à ce qu'on cherche pourquoi le code modifié ne prend pas. Votre « j'ai cru avoir perdu le serveur alors qu'il tournait toujours » dit exactement le coût.Vos options 2 et 3, écartées
prisma generate || trueaurait gardé le geste en masquant son échec. C'est la forme qui rend un défaut invisible sans le supprimer : le jour oùgenerateéchoue pour une vraie raison — un schéma invalide — plus rien ne le dit.Nommer la cause de l'EPERM aurait supposé d'envelopper une commande Prisma pour réinterpréter son message. Ça reste séduisant, et je ne l'ai pas fait pour une raison simple : une fois
generatesorti dedev, l'EPERM ne survient plus que surpnpm installoupnpm build— deux commandes qu'on ne lance pas en boucle pendant qu'une API tourne. Le coût du message n'est plus payé au même rythme.Si vous le rencontrez quand même sur
install, dites-le : à ce moment-là l'enveloppe se justifie, et ce sera un ticket avec sa propre fréquence.Ce qui est écrit
L'
AGENTS.mddu gabarit porte maintenant la raison, à côté de la commande — pour qu'on ne le remette pas dans six mois « par sécurité » :État
Branche
fix/prisma-generate-dev, tirée demain, fusionnable tout de suite : elle ne dépend d'aucune version du socle. C'est la seule des quatre branches du gabarit qui ne vous attend pas./connexion, qui n'existe pas : personne ne peut entrer dans l'application #23pnpm --filter api db:devest interactif : il bloque tout appelant non interactif, et l'interrompre laisse un verrou consultatif Postgres qui exige unpg_terminate_backendmanuel #63Corrigé, et par votre voie 1 :
prisma generateest sorti du scriptdev. Celui d'apps/apiest désormaisLa génération reste où elle protégeait déjà quelque chose —
postinstallet le script de migration. La régénérer à chaquedevne couvrait rien de plus, et elle échouait enEPERMdès qu'une autre instance tenait le moteur.db:schemareste en tête, comme vous le notiez : idempotent et rapide.Fermé après vérification sur
devle 2026-09-21. Ce ticket restait ouvert faute d'unCloses #24dans le commit, pas faute de correctif.