programing

npm: '--force'와 '--legacy-peer-deps'를 사용할 때

bestprogram 2023. 7. 26. 22:16

npm: '--force'와 '--legacy-peer-deps'를 사용할 때

나는 어떻게 그것을 재현하는지 이해하려고 노력하고 있습니다.node_modules배포를 위한 디렉터리가 작동합니다.

사용중다니입을 사용합니다.npm cinpm install배포 중에 깨끗한 슬레이트를 보장합니다.그러나 플래그 없이 실행하면 다음 오류가 발생합니다.

업스트림 종속성 충돌을 수정하거나 --force 또는 --legacy-peer-deps를 사용하여 이 명령을 다시 시도하여 잘못된 종속성 확인을 수락합니다.

다음에 대한 설명서npm install위해서--force다음과 같습니다(에 플래그가 없습니다).npm ci페이지):

-for --force 인수는 디스크에 로컬 복사본이 있더라도 npm이 원격 리소스를 가져오도록 합니다.

한편, 다에대문에 대한 --legacy-peer-deps다음과 같이 말합니다.

--legacy-peer-deps: npm 버전 4 ~ 버전 6의 스타일로 설치할 때 모든 peerDependencies를 무시합니다.

두 깃발 모두가 할 수 있을 것 같습니다.npm ci합니다.node_modules문제가 없는 디렉토리입니다만, 저는 여전히 둘 사이의 차이점에 대해 잘 모르겠습니다.

제가 알기로는--force마지막 종속성이 제한된 종속성을 기반으로 하며 이전에 다운로드한 종속성을 덮어씁니다.사이에 한편.--legacy-peer-deps문제가 없더라도 설치하는 동안 피어 종속성을 항상 건너뜁니다.

두 깃발의 차이점은 무엇이며, 언제 사용해야 합니까?

의 새 으로 npm(v7)이 됩니다.npm install충돌하는 peerDependencies가 발생하면 실패합니다.전에는 그렇지 않았습니다.

npm v7의 피어 종속성에 대한 자세한 내용은 여기를 참조하십시오.

두 가지 차이점은 다음과 같습니다.

  • --legacy-peer-deps설치 시 모든 peerDependencies를 무시합니다(npm 버전 4 ~ 버전 6).

  • --strict-peer-deps충돌하는 피어 종속성에 대한 설치 프로세스가 실패하고 중단됩니다.기본적으로 npm은 루트 프로젝트의 직접적인 종속성으로 인해 발생하는 peerDependencies 충돌에 대해서만 충돌합니다.

  • --force로컬 복사본이 디스크에 있더라도 npm이 원격 리소스를 가져오도록 합니다.

기사에서 npm 7은 이제 일반적으로 사용할 수 있습니다!,

하여 다시 .--force하거나 갈을우거나회하등▁the▁to나▁bypass거우회.--legacy-peer-deps피어 종속성을 완전히 무시하는 명령입니다(이 동작은 버전 4-6과 유사함).

저는 이 문장이 정말 명확하지 않다는 것에 동의하지만, "동료들의 의존성을 완전히 무시하라"는 것은 좋게 들리지 않습니다.실제 예를 사용해 보겠습니다.

다음은 피어 종속성 오류입니다.npm install:

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: mobile@undefined
npm ERR! Found: react@17.0.1
npm ERR! node_modules/react
npm ERR!   react@"17.0.1" from the root project
npm ERR!   peer react@">=16.0.0" from @testing-library/react-native@7.2.0
npm ERR!   node_modules/@testing-library/react-native
npm ERR!     dev @testing-library/react-native@"7.2.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"16.13.1" from react-native@0.63.2
npm ERR! node_modules/react-native
npm ERR!   react-native@"https://github.com/expo/react-native/archive/sdk-39.0.4.tar.gz" from the root project
npm ERR!   peer react-native@">=0.59" from @testing-library/react-native@7.2.0
npm ERR!   node_modules/@testing-library/react-native
npm ERR!     dev @testing-library/react-native@"7.2.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.
npm ERR!
npm ERR! See /Users/me/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/me/.npm/_logs/2021-03-13T00_10_33_813Z-debug.log
npm ERR! code 1
npm ERR! path /Users/me/my-app
npm ERR! command failed
npm ERR! command sh -c sh ./bin/setup.sh

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/me/.npm/_logs/2021-03-13T00_10_33_860Z-debug.log

아래는 package-lock.json 차이입니다.--legacy-peer-deps그리고.--force.

  1. 내가 뛰면,npm install --legacy-peer-deps package-lock.json에 이것을 추가합니다.
"node_modules/@unimodules/react-native-adapter": {
  "version": "5.7.0",
  "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz",
  "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==",
  "dependencies": {
    "invariant": "^2.2.4",
    "lodash": "^4.5.0"
  },
  "peerDependencies": {
    "react-native": "*",
    "react-native-web": "~0.13.7"
  }
},

...

"@unimodules/react-native-adapter": {
  "version": "5.7.0",
  "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz",
  "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==",
  "requires": {
    "invariant": "^2.2.4",
    "lodash": "^4.5.0"
  }
},
  1. 사용할 경우npm install --force대신에, 그것은 덧붙입니다.
"node_modules/expo/node_modules/@unimodules/react-native-adapter": {
  "version": "5.7.0",
  "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz",
  "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==",
  "dependencies": {
    "invariant": "^2.2.4",
    "lodash": "^4.5.0"
  },
  "peerDependencies": {
    "react-native": "*",
    "react-native-web": "~0.13.7"
  }
},
"node_modules/expo/node_modules/inline-style-prefixer": {
  "version": "5.1.2",
  "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz",
  "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==",
  "peer": true,
  "dependencies": {
    "css-in-js-utils": "^2.0.0"
  }
},
"node_modules/expo/node_modules/react-native-web": {
  "version": "0.13.18",
  "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz",
  "integrity": "sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA==",
  "peer": true,
  "dependencies": {
    "array-find-index": "^1.0.2",
    "create-react-class": "^15.6.2",
    "deep-assign": "^3.0.0",
    "fbjs": "^1.0.0",
    "hyphenate-style-name": "^1.0.3",
    "inline-style-prefixer": "^5.1.0",
    "normalize-css-color": "^1.0.2",
    "prop-types": "^15.6.0",
    "react-timer-mixin": "^0.13.4"
  },
  "peerDependencies": {
    "react": ">=16.5.1",
    "react-dom": ">=16.5.1"
  }
},

...

  "dependencies": {
    "@unimodules/react-native-adapter": {
      "version": "5.7.0",
      "resolved": "https://registry.npmjs.org/@unimodules/react-native-adapter/-/react-native-adapter-5.7.0.tgz",
      "integrity": "sha512-L557/+sc8ZKJVgo1734HF1QNCxrt/fpqdmdNgySJT+kErux/AJNfPq3flsK0fyJduVmniTutYIMyW48cFoPKDA==",
      "requires": {
        "invariant": "^2.2.4",
        "lodash": "^4.5.0"
      }
    },
    "inline-style-prefixer": {
      "version": "5.1.2",
      "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-5.1.2.tgz",
      "integrity": "sha512-PYUF+94gDfhy+LsQxM0g3d6Hge4l1pAqOSOiZuHWzMvQEGsbRQ/ck2WioLqrY2ZkHyPgVUXxn+hrkF7D6QUGbA==",
      "peer": true,
      "requires": {
        "css-in-js-utils": "^2.0.0"
      }
    },
    "react-native-web": {
      "version": "0.13.18",
      "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.13.18.tgz",
      "integrity": "sha512-WR/0ECAmwLQ2+2cL2Ur+0/swXFAtcSM0URoADJmG6D4MnY+wGc91JO8LoOTlgY0USBOY+qG/beRrjFa+RAuOiA==",
      "peer": true,
      "requires": {
        "array-find-index": "^1.0.2",
        "create-react-class": "^15.6.2",
        "deep-assign": "^3.0.0",
        "fbjs": "^1.0.0",
        "hyphenate-style-name": "^1.0.3",
        "inline-style-prefixer": "^5.1.0",
        "normalize-css-color": "^1.0.2",
        "prop-types": "^15.6.0",
        "react-timer-mixin": "^0.13.4"
      }
    }
  }
},

보시다시피.npm install --force여전히 더 엄격한 많은 종속성 버전을 고정합니다.

어느 것이 더 안전한지 궁금해하는 사람들에게 답은--force

--legacy-peer-deps피어 종속성을 완전히 무시하므로 종속성 확인이 손상될 수 있습니다.

--force반면에, 서로 충돌하는 종속성에 대해 다른 피어 종속성 버전을 설정하기만 하면

그러나 각 종속 버전이 추가 공간을 차지하기 때문에 힘을 사용하는 것이 항상 이상적인 것은 아닙니다.많은 종속성을 가진 힘을 사용하면 필요한 총 공간이 상당히 증가합니다.

npm 피어 종속성 오류를 제거하거나 피어 종속성을 무시하는 임시 해결 방법을 사용하려면 --legacy-peer-deps를 사용하지만 충돌하는 피어 종속성 트리와 다른 피어 종속성 트리를 설정하려면 --force를 사용합니다.여기에서 자세한 정보 찾기

언급URL : https://stackoverflow.com/questions/66020820/npm-when-to-use-force-and-legacy-peer-deps