npm err - ELIFECYCLE 해결방법

i_dd_k·2022년 4월 27일
2

회사에서 Angular 프로젝트를 진행하던 도중 다음과 같은 오류를 마주쳤다.

npm ERR! code ELIFECYCLE

빌드 도중 노트북 배터리가 없어서 꺼져버렸는데 그때 이후로 이런 에러가 나왔다.
구글링 해보니 해결 방법은 다음과 같았다.


해결 방법

1. npm cache clean --force
2. node_modules 삭제
3. package-lock.json 삭제
4. npm install


깔끔하게 다 지우고 다시 설치하라는 뜻이고, 그대로 따라 했더니 문제는 해결했다.
그런데 궁금한게 생겼다.

npm cache가 뭐지???

npm cache란?

먼저 npm 공식 문서를 살펴보자.

npm stores cache data in an opaque directory within the configured cache, named _cacache. This directory is a cacache-based content-addressable cache that stores all http request data as well as other package-related data. This directory is primarily accessed through pacote, the library responsible for all package fetching as of npm@5.

npm은 _cacache라는 구성된 캐시 내의 불투명한 디렉토리에 캐시 데이터를 저장합니다. 이 디렉토리는 모든 http 요청 데이터와 기타 패키지 관련 데이터를 저장하는 캐시 기반 콘텐츠 주소 지정 가능 캐시입니다. 이 디렉토리는 주로 npm@5부터 모든 패키지 가져오기를 담당하는 라이브러리인 pacote를 통해 액세스됩니다.

All data that passes through the cache is fully verified for integrity on both insertion and extraction. Cache corruption will either trigger an error, or signal to pacote that the data must be refetched, which it will do automatically. For this reason, it should never be necessary to clear the cache for any reason other than reclaiming disk space, thus why clean now requires --force to run.

캐시를 통과하는 모든 데이터는 삽입 및 추출 모두에서 무결성이 완전히 검증됩니다. 캐시가 손상되면 오류가 발생하거나 데이터를 다시 불러와야 한다는 신호를 전송하여 자동으로 데이터를 다시 불러옵니다. 이러한 이유로 디스크 공간을 회수하는 것 이외의 다른 이유로 캐시를 지울 필요가 없으므로, 지금 정리를 수행하려면 --force가 필요합니다.


요약하면 다음과같다.

  • npm의 cache는 _cacache라는 디렉토리에 저장한다.
  • npm cache는 모든 http 요청 데이터와 여러 패키지 데이터를 저장한다.
  • content-addressable cache(CAM)이다.
  • 캐시를 통과하는 모든 데이터는 무결성을 검증한다.
  • 캐시가 손상되면 오류가 발생한다.
  • 캐시를 지우고 싶다면 --force 라는 명령어를 사용해라.

눈에 띄는 부분은 모든 http 요청 데이터와 패키지의 데이터를 저장한다는 것이다.
그리고 content-addressable-cache라는 것인데..
이건 여기서 포스팅하기에는 너무 길어질것 같으니 다음 포스트에 작성해야 겠다.


cache 확인하기

직접 cache를 확인해보자.
맥 기준으로 npm cache는 다음 디렉토리에 저장된다.

~/.npm/_cacache

_cacache에 어떤것들이 있는지 확인해봤더니 다음과 같았다.

index-v5 디렉토리에 들어가서 어떤것들이 있는지 확인해봤다.
아래와 같은 디렉토리들이 있었고, 각 디렉토리 안에는 비슷한 형식으로 또 다른 디렉토리가 있었다.

가장 깊숙한 디렉토리에는 다음과 같은 파일(9a222...22c)을 확인할 수 있었다.
해당 파일이 어떤 내용을 담고있는지 cat 명령어로 확인해보니, 신기하게도 알수 없는 값과 함께 json 형식의 데이터가 저장되어 있는것을 확인할 수 있었다.

위의 json데이터를 좀 더 보기좋게 확인해보자.

{
  "key": "make-fetch-happen:request-cache:https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
  "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
  "time": 1644119029565,
  "size": 3079,
  "metadata": {
    "time": 1644119029514,
    "url": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
    "reqHeaders": {},
    "resHeaders": {
      "cache-control": "public, immutable, max-age=31557600",
      "content-type": "application/octet-stream",
      "date": "Sun, 06 Feb 2022 03:43:49 GMT",
      "etag": "\"445e70b75ab7215bc0da1fbaa36113cd\"",
      "last-modified": "Sun, 27 May 2018 04:48:21 GMT",
      "vary": "Accept-Encoding"
    }
  }
}

metadata의 url에 invariant-2.2.4 패키지의 tgz파일 경로를 저장하고 있는것을 확인할 수 있었다. 이 파일 외에 다른 파일도 확인해보자.

{
  "key": "make-fetch-happen:request-cache:https://registry.npmjs.org/fs-minipass",
  "integrity": "sha512-NHy9UZL7aUYF8y5LNFl590GpWAEYvZ7f6rFqyTen9T3NmMJDwHgRvIAOw1irZs0RYYI0/slqsIzIPmA7eRl9og==",
  "time": 1650182169239,
  "size": 10752,
  "metadata": {
    "url": "https://registry.npmjs.org/fs-minipass",
    "reqHeaders": {
      "npm-in-ci": [
        "false"
      ],
      "npm-scope": [
        ""
      ],
      "npm-session": [
        "4c7f733831036301"
      ],
      "user-agent": [
        "npm/6.14.6 node/v12.18.3 darwin x64"
      ],
      "referer": [
        "install"
      ],
      "pacote-req-type": [
        "packument"
      ],
      "pacote-pkg-id": [
        "registry:fs-minipass"
      ],
      "accept": [
        "application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*"
      ]
    },
    "resHeaders": {
      "date": [
        "Sun, 17 Apr 2022 07:56:09 GMT"
      ],
      "connection": [
        "keep-alive"
      ],
      "cf-ray": [
        "6fd39a39fe8c932c-ICN"
      ],
      "cache-control": [
        "public, max-age=300"
      ],
      "etag": [
        "\"e8d05b5422883cbc99fabe751be8b219\""
      ],
      "last-modified": [
        "Tue, 07 Dec 2021 20:22:27 GMT"
      ],
      "vary": [
        "Accept-Encoding"
      ],
      "cf-cache-status": [
        "REVALIDATED"
      ],
      "expect-ct": [
        "max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""
      ],
      "x-amz-replication-status": [
        "COMPLETED"
      ],
      "server": [
        "cloudflare"
      ],
      "x-fetch-attempts": [
        "1"
      ],
      "x-local-cache": [
        "%2FUsers%2Fimdong-uk%2F.npm%2F_cacache"
      ],
      "x-local-cache-key": [
        "make-fetch-happen%3Arequest-cache%3Ahttps%3A%2F%2Fregistry.npmjs.org%2Ffs-minipass"
      ],
      "x-local-cache-hash": [
        "sha512-NHy9UZL7aUYF8y5LNFl590GpWAEYvZ7f6rFqyTen9T3NmMJDwHgRvIAOw1irZs0RYYI0%2FslqsIzIPmA7eRl9og%3D%3D"
      ],
      "x-local-cache-time": [
        "Sun, 06 Feb 2022 04:05:47 GMT"
      ]
    }
  }
}

위에서 확인한 두개의 파일을 통해 cache 데이터에는 reqHeaders, resHeaders 등 http 요청에 대한 데이터와 각 패키지들에 대한 데이터(패키지 다운로드 경로 등)가 저장되어 있는것을 확인할 수 있었다.


cache 삭제 후 확인하기.

npm cache는 다음 명령어를 통해 삭제할 수 있다.

npm cache clean --force

위 명령어를 실행했을때 cache가 삭제되는지 확인해보자.

_cacache 디렉토리는 남아있고 그 안의 내용들이 삭제될 줄 알았는데 _cacache 디렉토리 자체가 지워진걸 확인할 수 있었다.


지금까지 npm의 cache에 대해 알아보았다.
npm도 cache를 활용 한다는걸 처음 알았고 위와 같은 데이터들이 저장 된다는것도 처음 알았다. 단순히 오류만 해결하고 끝냈으면 알 수 없었을 내용들이었다.


npm-cache doc : https://docs.npmjs.com/cli/v6/commands/npm-cache#details

0개의 댓글