✦ Oplossingen · Server- en developerfouten

npm ERR! code ERESOLVE: unable to resolve dependency tree

Stopt npm install met ‘code ERESOLVE’ of ‘unable to resolve dependency tree’? Pakketten eisen andere versies. Zo lees je de melding en los je het op.

Zo ziet de foutmelding eruit

  • npm ERR! code ERESOLVE
  • npm ERR! ERESOLVE unable to resolve dependency tree
  • npm error code ERESOLVE
  • npm error ERESOLVE unable to resolve dependency tree
  • npm ERR! ERESOLVE could not resolve
  • Could not resolve dependency:

Waarom gebeurt dit?

ERESOLVE betekent dat npm geen combinatie van pakketversies kan vinden die aan alle eisen voldoet. Meestal gaat het om peerDependencies: een pakket zegt ‘ik werk alleen samen met versie X van dat andere pakket’, bijvoorbeeld een plugin die een bepaalde versie van React, Angular, ESLint of webpack verwacht. Heeft je project een andere versie, dan botsen de eisen.

Sinds npm 7 installeert npm peerDependencies automatisch en controleert het die streng. Een conflict dat oudere npm-versies alleen als waarschuwing toonden, stopt de installatie nu met ERESOLVE. Daarom zie je deze fout vaak bij oudere projecten, na het bijwerken van één hoofdpakket, of als een plugin de nieuwste versie van zijn hoofdpakket nog niet ondersteunt.

De melding zelf vertelt precies wat er botst. Onder Found staat wat er nu is, onder Could not resolve dependency welk pakket welke versie verwacht. Wie die drie regels leest, weet meestal al welke versie moet veranderen.

Zo herken je dit probleem

  • De installatie stopt met code ERESOLVE en noemt regels met While resolving, Found en Could not resolve dependency.
  • Het gebeurt na het toevoegen of bijwerken van één pakket, terwijl het project daarvoor gewoon installeerde.
  • Gaat het om rechten bij npm install -g, dan is het npm EACCES.
  • Bij PHP-projecten met Composer speelt hetzelfde soort conflict; zie Composer- en Laravel-fouten.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Lees welke pakketten botsen

    Scroll naar het begin van de foutmelding. Je ziet welk pakket welke versie verwacht en welke versie er gevonden is. In dit voorbeeld verwacht oud-pakket React 17, terwijl het project React 18 gebruikt. npm schrijft ook een volledig rapport weg; het pad staat onderaan de melding.

    npm error While resolving: mijn-app@1.0.0
    npm error Found: react@18.3.1
    npm error   react@"^18.2.0" from the root project
    npm error
    npm error Could not resolve dependency:
    npm error peer react@"^17.0.0" from oud-pakket@2.1.0
  2. Bekijk waar een pakket vandaan komt

    Met npm ls en npm explain zie je welke pakketten een afhankelijkheid binnenhalen en in welke versie. Zo weet je of het om een pakket gaat dat je zelf hebt toegevoegd of om iets dat diep in de boom zit.

    npm ls react --all
    npm explain react
  3. Zoek een versie die wel past

    Kijk of er een nieuwere versie is van het pakket dat de oude peer-versie eist; vaak ondersteunt die de nieuwe versie al. Met npm view zie je de beschikbare versies en de peerDependencies per versie. Werk dat pakket bij, of kies tijdelijk een versie van het hoofdpakket die beide ondersteunen.

    npm view oud-pakket versions
    npm view oud-pakket peerDependencies
    npm view oud-pakket@latest peerDependencies
    npm install oud-pakket@latest
  4. Controleer je Node.js- en npm-versie

    Een ander team of de server kan een andere npm-versie gebruiken die anders met peerDependencies omgaat. Leg de verwachte versie vast, bijvoorbeeld in engines in package.json of een .nvmrc, zodat iedereen hetzelfde resultaat krijgt.

    node -v
    npm -v
  5. Vervang een verlaten pakket

    Wordt een pakket niet meer bijgewerkt en blijft het een oude versie eisen, overweeg dan een alternatief dat wel wordt onderhouden. Op de lange duur is dat vaak minder werk dan de botsing steeds opnieuw omzeilen.

  6. Forceer een versie met overrides

    Weet je zeker dat het pakket met de nieuwere versie werkt (lees de changelog en test), dan kun je npm met overrides in package.json opdragen een bepaalde versie te gebruiken. $react verwijst naar de versie die je project zelf in dependencies heeft staan. Installeer daarna opnieuw en test de onderdelen die het pakket gebruiken.

    {
      "dependencies": {
        "react": "^18.2.0",
        "oud-pakket": "^2.1.0"
      },
      "overrides": {
        "oud-pakket": {
          "react": "$react"
        }
      }
    }
  7. Gebruik --legacy-peer-deps bewust en tijdelijk

    Met --legacy-peer-deps negeert npm peerDependencies, zoals oudere versies deden. De installatie slaagt dan, maar het conflict is er nog: het pakket kan in de praktijk alsnog fouten geven. --force gaat nog verder en accepteert ook andere conflicten. Gebruik dit om verder te kunnen werken en plan een echte oplossing. Zet je het in .npmrc, dan geldt het voor iedereen en voor de build-server; vermeld dan waarom.

    npm install --legacy-peer-deps
    
    # projectbreed (.npmrc in de projectmap)
    legacy-peer-deps=true

Let op: Verwijder niet als eerste package-lock.json om de fout weg te krijgen. Dan rekent npm alle versies opnieuw uit en kunnen tientallen pakketten tegelijk veranderen, met nieuwe fouten als gevolg.

ERESOLVE op de build-server of bij npm ci

Installeert het lokaal wel en op de server of in de CI-pijplijn niet, dan zit het verschil meestal in de omgeving:

  • Lokaal is met --legacy-peer-deps geïnstalleerd, maar de server draait npm ci zonder die optie. Zet de instelling dan in .npmrc of los het conflict echt op.
  • De server gebruikt een andere npm-versie die strenger of anders omgaat met peerDependencies.
  • package.json is gewijzigd zonder dat package-lock.json is bijgewerkt en meegecommit; npm ci weigert dan te installeren.

Wanneer schakel je hulp in?

  • Het conflict zit diep in de afhankelijkheden en je ziet niet welk pakket je moet aanpassen.
  • Een project van een vorige ontwikkelaar installeert niet meer en je wilt het veilig bijwerken.
  • De build op de server faalt met ERESOLVE terwijl het lokaal wel werkt.
  • Je hebt --legacy-peer-deps gebruikt en de app geeft nu onverklaarbare fouten.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Wat betekent npm ERR! code ERESOLVE?

npm kan geen combinatie van pakketversies vinden die aan alle eisen voldoet, meestal door een conflict in peerDependencies. De melding noemt welk pakket welke versie verwacht.

Is --legacy-peer-deps veilig?

Het laat de installatie slagen door peerDependencies te negeren, maar lost het conflict niet op. Gebruik het tijdelijk en zoek daarna een passende versie of een override die je hebt getest.

Wat is het verschil tussen --force en --legacy-peer-deps?

--legacy-peer-deps slaat het installeren en controleren van peerDependencies over. --force dwingt de installatie door ondanks conflicten en kan meer onverwachte versies opleveren.

Wat zijn peerDependencies?

Pakketten die een plugin of bibliotheek zelf niet meelevert, maar wel verwacht in je project, in een bepaalde versie. Een plugin voor React verwacht bijvoorbeeld dat jouw project React heeft.