Heroku部署Node.js代码遇依赖冲突问题求助
问题描述
执行git push heroku master后,Heroku构建环节运行heroku-postbuild脚本时触发ERESOLVE依赖解析失败。核心冲突是项目依赖的react@16.14.0与开发依赖@wojtekmaj/enzyme-adapter-react-17@0.6.6要求的peer依赖react@^17.0.0-0不兼容。
错误日志
remote: -----> Build remote: Running heroku-postbuild remote: remote: > mentordial@1.0.0 heroku-postbuild remote: > npm install --prefix client && npm run build --prefix client remote: remote: npm ERR! code ERESOLVE remote: npm ERR! ERESOLVE could not resolve remote: npm ERR! remote: npm ERR! While resolving: @wojtekmaj/enzyme-adapter-react-17@0.6.6 remote: npm ERR! Found: react@16.14.0 remote: npm ERR! node_modules/react remote: npm ERR! react@"^16.13.1" from the root project remote: npm ERR! peer react@">=16.8.6" from @dytesdk/react-ui-kit@1.37.0 remote: npm ERR! node_modules/@dytesdk/react-ui-kit remote: npm ERR! @dytesdk/react-ui-kit@"^1.37.0" from the root project remote: npm ERR! 47 more (@dytesdk/react-web-core, @emotion/react, ...) remote: npm ERR! remote: npm ERR! Could not resolve dependency: remote: npm ERR! peer react@"^17.0.0-0" from @wojtekmaj/enzyme-adapter-react-17@0.6.6 remote: npm ERR! node_modules/@wojtekmaj/enzyme-adapter-react-17 remote: npm ERR! dev @wojtekmaj/enzyme-adapter-react-17@"^0.6.6" from the root project remote: npm ERR! remote: npm ERR! Conflicting peer dependency: react@17.0.2 remote: npm ERR! node_modules/react remote: npm ERR! peer react@"^17.0.0-0" from @wojtekmaj/enzyme-adapter-react-17@0.6.6 remote: npm ERR! node_modules/@wojtekmaj/enzyme-adapter-react-17 remote: npm ERR! dev @wojtekmaj/enzyme-adapter-react-17@"^0.6.6" from the root project remote: npm ERR! remote: npm ERR! Fix the upstream dependency conflict, or retry remote: npm ERR! this command with --force, or --legacy-peer-deps remote: npm ERR! to accept an incorrect (and potentially broken) dependency resolution. remote: npm ERR! remote: npm ERR! See /tmp/npmcache.o3KAI/eresolve-report.txt for a full report. remote: remote: npm ERR! A complete log of this run can be found in: remote: npm ERR! /tmp/npmcache.o3KAI/_logs/2024-06-03T21_45_52_893Z-debug-0.log remote: remote: -----> Build failed
项目package.json配置
{ "name": "test", "version": "0.1.0", "private": true, "dependencies": { "@babel/core": "^7.17.2", "@babel/preset-env": "^7.16.11", "@dytesdk/react-ui-kit": "^1.37.0", "@dytesdk/react-web-core": "^1.14.0", "@dytesdk/web-core": "^0.42.0", "@stripe/react-stripe-js": "^1.7.0", "@stripe/stripe-js": "^1.22.0", "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", "@testing-library/user-event": "^13.5.0", "@types/jest": "^27.5.1", "@types/node": "^16.11.36", "@types/react": "^18.0.9", "@types/react-dom": "^18.0.5", "add-to-calendar-button": "^1.18.6", "amplitude-js": "^8.17.0", "availability-calendar-react": "^1.0.10", "axios": "^0.24.0", "babel-jest": "^27.5.1", "babel-preset-env": "^1.7.0", "bootstrap": "^5.1.3", "bootstrap-icons": "^1.7.2", "cors": "^2.8.5", "crypto-browserify": "^3.12.0", "htm": "^3.1.0", "itsa-react-multiselect": "^16.0.8", "jest": "^27.5.1", "jest-mock-axios": "^4.5.0", "jest-transform-css": "^3.0.0", "lodash": "^4.17.21", "moment": "^2.29.1", "moment-range": "^4.0.2", "moment-timezone": "^0.5.34", "multi-tier-menu": "^1.0.16", "process": "^0.11.10", "query-string": "^7.0.1", "react": "^16.13.1", "react-beforeunload": "^2.5.3", "react-bootstrap": "^2.1.0", "react-calendar": "^3.7.0", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^16.13.1", "react-facebook-login": "^4.1.1", "react-google-charts": "^4.0.0", "react-hook-form": "^7.22.4", "react-languages-select": "^1.0.20", "react-meta-tags": "^1.0.1", "react-multi-search-select": "^1.3.0", "react-multi-select-component": "^4.1.14", "react-paypal-button-v2": "^2.6.3", "react-phone-input-2": "^2.15.0", "react-router-dom": "^5.2.0", "react-scripts": "5.0.0", "react-scroll-to-bottom": "^4.2.0", "react-select": "^5.2.1", "react-select-country-list": "^2.2.3", "react-select-timezone": "^1.0.0", "react-share-social": "^0.1.48", "react-simple-star-rating": "^4.0.5", "react-social-buttons": "^1.1.1", "react-stripe-elements": "^6.1.2", "react-timeslot-calendar": "^0.2.0", "react-timezone-select": "^1.1.15", "react-tz": "^1.0.0", "spacetime": "^7.1.0", "stream-browserify": "^3.0.0", "timezones-list": "^3.0.1", "ts-jest": "^27.1.3", "typescript": "^4.7.2", "web-vitals": "^2.1.2" }, "scripts": { "start": "export HTTPS=true&&SSL_CRT_FILE=cert.pem&&SSL_KEY_FILE=key.pem react-scripts start", "build": "react-scripts build", "test": "jest", "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": { "@babel/plugin-transform-modules-commonjs": "^7.16.8", "@wojtekmaj/enzyme-adapter-react-17": "^0.6.6", "enzyme": "^3.11.0", "enzyme-to-json": "^3.6.2", "esbuild": "^0.14.21", "esbuild-jest": "^0.5.0", "jest-cli": "^27.4.7", "moxios": "^0.4.0", "react-test-renderer": "^17.0.2" } }
解决方案
方案一:适配React版本降级Enzyme适配器
项目使用React 16,无需React 17的适配器。将devDependencies中的@wojtekmaj/enzyme-adapter-react-17替换为@wojtekmaj/enzyme-adapter-react-16(版本可选择^0.6.6),同时把react-test-renderer降级到^16.14.0,与项目React版本保持一致。修改后执行npm install,再重新推送Heroku。方案二:在构建命令中添加依赖兼容参数
修改heroku-postbuild脚本,添加--legacy-peer-deps参数跳过peer依赖严格检查:"heroku-postbuild": "npm install --legacy-peer-deps --prefix client && npm run build --prefix client"此方法可以快速解决构建失败问题,但可能存在潜在兼容性风险,建议本地测试后再推送。
方案三:升级项目React到17.x版本
如果项目其他依赖兼容React 17,可将dependencies中的react和react-dom版本升级到^17.0.2,同时确保react-router-dom、react-bootstrap等依赖也支持React 17。升级后,@wojtekmaj/enzyme-adapter-react-17的peer依赖要求将得到满足,冲突自然消除。
内容的提问来源于stack exchange,提问作者Rue Vitale

