3
respostas

Erro ao instalar dependencias do ESLint

Olá! Durante a configuração do ESLint, aonde ele fala que precisa de algumas dependências, ele dá erro no npm:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
npm ERR!
npm ERR! While resolving: aluroni@0.1.0
npm ERR! Found: @typescript-eslint/eslint-plugin@5.12.1
npm ERR! node_modules/@typescript-eslint/eslint-plugin
npm ERR!   @typescript-eslint/eslint-plugin@"^5.5.0" from eslint-config-react-app@7.0.0
npm ERR!   node_modules/eslint-config-react-app
npm ERR!     eslint-config-react-app@"^7.0.0" from react-scripts@5.0.0   
npm ERR!     node_modules/react-scripts
npm ERR!       react-scripts@"5.0.0" from the root project
npm ERR!   peerOptional @typescript-eslint/eslint-plugin@"^4.0.0 || ^5.0.0" from eslint-plugin-jest@25.7.0
npm ERR!   node_modules/eslint-plugin-jest
npm ERR!     eslint-plugin-jest@"^25.3.0" from eslint-config-react-app@7.0.0
npm ERR!     node_modules/eslint-config-react-app
npm ERR!       eslint-config-react-app@"^7.0.0" from react-scripts@5.0.0 
npm ERR!       node_modules/react-scripts
npm ERR!         react-scripts@"5.0.0" from the root project
npm ERR!   1 more (the root project)
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! dev @typescript-eslint/eslint-plugin@"7.5.0" from the root project
npm ERR!
npm ERR! Conflicting peer dependency: @typescript-eslint/parser@7.5.0    
npm ERR! node_modules/@typescript-eslint/parser
npm ERR!   peer @typescript-eslint/parser@"^7.0.0" from @typescript-eslint/eslint-plugin@7.5.0
npm ERR!   node_modules/@typescript-eslint/eslint-plugin
npm ERR!     dev @typescript-eslint/eslint-plugin@"7.5.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

Como resolver isso? A versão do node que estou usando é a 20.11.0. Obrigado!

3 respostas

O erro que você está enfrentando com o npm é devido a um conflito de dependências entre as versões requeridas pelo seu projeto e as versões de pacotes disponíveis ou especificadas em suas dependências diretas ou indiretas. Esse tipo de problema é comum quando se trabalha com um grande número de dependências em projetos JavaScript, especialmente em um ecossistema em rápida evolução como o do Node.js e seus frameworks.

Aqui estão algumas estratégias que você pode usar para resolver esse problema:

1. Use --legacy-peer-deps

Uma abordagem rápida é rodar o comando de instalação com a opção --legacy-peer-deps, que instrui o npm a ignorar conflitos de peer dependencies e continuar com a instalação usando versões legadas das dependências.

npm install --legacy-peer-deps

Isso pode permitir que a instalação prossiga sem resolver o conflito diretamente, mas tenha em mente que isso pode potencialmente levar a comportamentos inesperados ou bugs se as versões incompatíveis das dependências forem usadas juntas.

2. Atualize ou Reinstale Dependências

Verifique se há atualizações disponíveis para as dependências que estão causando o conflito (@typescript-eslint/eslint-plugin e possivelmente @typescript-eslint/parser) e atualize-as para versões compatíveis. Você também pode tentar reinstalar as dependências para resolver qualquer incompatibilidade.

npm update

ou especificamente para as dependências problemáticas:

npm install @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest

3. Verifique as Versões das Dependências

Verifique o package.json para garantir que as versões das dependências não estão fixas em versões que causam conflitos. Você pode tentar ajustar as versões manualmente para compatibilidade com base nas mensagens de erro e nas dependências de outros pacotes que você está usando.

4. Use um Resolvedor de Conflitos

Alguns conflitos de versão podem ser complicados de resolver manualmente. Ferramentas como o npm-check-updates podem ajudar a identificar e atualizar todas as suas dependências para as últimas versões compatíveis.

npm install -g npm-check-updates
ncu -u
npm install

5. Examine a Árvore de Dependências

Se você ainda estiver enfrentando problemas, pode ser útil examinar a árvore de dependências para entender melhor onde os conflitos estão ocorrendo. Isso pode ser feito com:

npm ls

Este comando mostrará onde os conflitos de dependência estão acontecendo, o que pode ajudar a identificar a melhor forma de resolvê-los.

Nota sobre Versões do Node.js

Dado que você está usando uma versão recente do Node.js (20.11.0 no seu caso), é improvável que o problema seja causado diretamente pela versão do Node.js, mas é sempre bom garantir que suas ferramentas e dependências sejam compatíveis com a versão do Node.js em uso.

Resolver conflitos de dependência pode ser um processo iterativo e, às vezes, complexo, especialmente em projetos grandes ou com muitas dependências interconectadas. Se uma abordagem não funcionar, você pode precisar tentar outra até que o problema seja resolvido.

Segui os passos e de fato tinha versões mais atuais. Quando rodo o comando npm ls, ele retorna isso:

├── @testing-library/jest-dom@5.16.1 invalid: "^6.4.2" from the root project  
├── @testing-library/react@12.1.2 invalid: "^14.3.0" from the root project    
├── @testing-library/user-event@13.5.0 invalid: "^14.5.2" from the root project
├── @types/jest@27.4.0 invalid: "^29.5.12" from the root project
├── @types/node@16.11.21 invalid: "^20.12.7" from the root project
├── @types/react-dom@17.0.11 invalid: "^18.2.24" from the root project        
├── @types/react@17.0.38 invalid: "^18.2.75" from the root project
├── @typescript-eslint/eslint-plugin@5.12.1 invalid: "^7.6.0" from the root project
├── @typescript-eslint/parser@5.12.1 invalid: "^7.6.0" from the root project  
├── classnames@2.3.1 invalid: "^2.5.1" from the root project
├── eslint-plugin-react@7.28.0 invalid: "^7.34.1" from the root project       
├── eslint@8.9.0 invalid: "^9.0.0" from the root project
├── normalize.css@8.0.1
├── react-dom@17.0.2 invalid: "^18.2.0" from the root project
├── react-icons@4.3.1 invalid: "^5.0.1" from the root project
├── react-scripts@5.0.0 invalid: "5.0.1" from the root project
├── react@17.0.2 invalid: "^18.2.0" from the root project
├── sass@1.49.0 invalid: "^1.74.1" from the root project
├── typescript-plugin-css-modules@3.4.0 invalid: "^5.1.0" from the root project
├── typescript@4.5.5 invalid: "^5.4.4" from the root project
└── web-vitals@2.1.4 invalid: "^3.5.2" from the root project

O que isso quer dizer? O package.json está assim:

{
  "name": "aluroni",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^6.4.2",
    "@testing-library/react": "^14.3.0",
    "@testing-library/user-event": "^14.5.2",
    "@types/jest": "^29.5.12",
    "@types/node": "^20.12.7",
    "@types/react": "^18.2.75",
    "@types/react-dom": "^18.2.24",
    "classnames": "^2.5.1",
    "normalize.css": "^8.0.1",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-icons": "^5.0.1",
    "react-scripts": "5.0.1",
    "typescript": "^5.4.4",
    "web-vitals": "^3.5.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^7.6.0",
    "@typescript-eslint/parser": "^7.6.0",
    "eslint": "^9.0.0",
    "eslint-plugin-react": "^7.34.1",
    "sass": "^1.74.1",
    "typescript-plugin-css-modules": "^5.1.0"
  }
}

Eu até rodei o --legacy-peer-deps que deu certo, mas como você disse que poderia acontecer comportamentos inesperados ou bugs, achei melhor seguir com os passos seguintes.

Depois de tudo, quando rodo npm update, ele volta a dar erro:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: aluroni@0.1.0
npm ERR! Found: eslint@9.0.0
npm ERR! node_modules/eslint
npm ERR!   dev eslint@"^9.0.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer eslint@"^8.56.0" from @typescript-eslint/parser@7.6.0
npm ERR! node_modules/@typescript-eslint/parser
npm ERR!   dev @typescript-eslint/parser@"^7.6.0" from the root project       
npm ERR!   peer @typescript-eslint/parser@"^7.0.0" from @typescript-eslint/eslint-plugin@7.6.0
npm ERR!   node_modules/@typescript-eslint/eslint-plugin
npm ERR!     dev @typescript-eslint/eslint-plugin@"^7.6.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.

A mensagem de erro e a lista de dependências que você compartilhou indicam vários problemas de compatibilidade de versão entre as bibliotecas instaladas no seu projeto e as versões especificadas no seu package.json. Essas incompatibilidades acontecem porque as versões instaladas das bibliotecas não correspondem às versões que você especificou como dependências no seu package.json.

Quando o npm ls mostra a palavra "invalid" ao lado de uma biblioteca, significa que a versão instalada da biblioteca não corresponde à versão especificada no seu package.json. Isso pode ocorrer por várias razões, como alterações manuais nos arquivos de lock (package-lock.json ou yarn.lock), uso de flags como --force ou --legacy-peer-deps sem resolver as incompatibilidades de versão subsequentes, ou atualizações de dependências por parte dos mantenedores das bibliotecas.

O erro específico que você encontrou ao tentar rodar npm update:

npm ERR! ERESOLVE unable to resolve dependency tree
...
npm ERR! Could not resolve dependency:
npm ERR! peer eslint@"^8.56.0" from @typescript-eslint/parser@7.6.0

Indica um conflito de versão entre eslint (versão 9.0.0 especificada no seu package.json) e @typescript-eslint/parser (que espera uma versão do eslint compatível com ^8.56.0). Isso significa que a versão do eslint que você está tentando usar é mais recente do que a suportada pelo @typescript-eslint/parser versão 7.6.0.

Para resolver esse tipo de problema, você tem algumas opções:

  1. Resolver os Conflitos Manualmente: Atualize as versões no seu package.json para garantir que elas sejam compatíveis entre si. Isso pode exigir que você verifique as versões compatíveis no npm ou nos repositórios das bibliotecas. Por exemplo, você pode precisar reverter a versão do eslint para uma que seja compatível com o @typescript-eslint/parser ou atualizar o @typescript-eslint/parser e seus plugins relacionados para versões que suportem eslint@9.0.0.

  2. Usar --legacy-peer-deps: Como você mencionou, usar npm install --legacy-peer-deps ou npm update --legacy-peer-deps pode contornar esses erros permitindo a instalação de versões incompatíveis, mas isso pode levar a comportamentos inesperados ou bugs, pois você está ignorando os conflitos de versão.

  3. Forçar Atualizações: Usando npm update --force pode forçar a atualização, mas assim como --legacy-peer-deps, isso ignora os conflitos de versão e pode causar problemas.

A melhor abordagem é tentar alinhar as versões das suas dependências para garantir compatibilidade, o que pode requerer um pouco de pesquisa para encontrar um conjunto de versões que funcionem bem juntas. Isso muitas vezes envolve verificar a documentação das bibliotecas para encontrar as versões de peer dependencies recomendadas.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software