네트워크에 의존하지 않는 package-lock.json 만들기

Table of Contents

1. 개요

node 프로젝트를 진행하다보면 흔히들 package-lock.json 파일은 삭제하는 경우가 많다.

하지만 그렇게 3개월정도 프로젝트를 방치해 두었다가 node-modules 삭제후 재빌드를 수행해 보면

빌드가 안되는 경우를 종종 볼 수가 있다.

2. 문제는...

modern javascript 프로젝트 들은 샌드박스 특성상 오픈소스 활동이 왕성하여

여러 커뮤니티들의 요구사항들을 적극 받아들이고 있고 버젼변화도 빠른 편이다.

게다가 하나의 node 프로젝트 는 다시 여러개의 작은 프로젝트 조합으로 이루어져 있고,

이들 역시 버젼변화가 진행된다.

이렇다보니 메이저급 버젼변화 (가령 v2.x -> v3.x)가 있는 경우에는 하위호환성을 버리는 경우가 종종 발생하여

개발자들은 또 이들의 사용법을 다시 익혀야 할 정도로 변화되기도 한다
(마치 90 년대 dll-hell, dependency-hell 현상을 보는듯 하다).

이렇다보니 패키지 의존성 역시 수시로 바뀌고 있고, package-lock.json
또는 node-modules 를 보존하고 있지 않다면

이러한 이유로 이전에 수행했던 프로젝트가 정상적으로 빌드되지 않는것이다.

그래서 package-lock.json 파일은 삭제하지 않는것을 권장하는 편이고.

이 파일만 유지하면.

3. 일상적으로는 문제될 바 없으나...

일상적인 프로젝트인 경우에는 인터넷이 항상 연결되어 있어 package-lock.json 파일만 있다면
node-modules 파일을 유실했어도 언제든 문제없이 빌드할 수 있다.

문제는 폐쇄망에서 프로젝트를 진행할 경우 이다. (공공기관, 군시설, 은행권 등)

보통은 nexus repository 를 이용해 패키지 의존정보를 가져오게 되는데 package-lock.json 파일은 이 때

repository 의 주소 또는 ip정보 까지 모두 기록하게 된다.

물론 nexus repository 가 몇년이고 계속 유지된다면 이 또한 문제될 것 없으나

보통은 프로젝트를 종료하고나서 이 쓸모없이 리소스만 낭비하고 있는 repository 서버를 내려버린다.

그리고 나중에 다시 띄우려면 ip정보가 달라지기 일쑤이니 다시 프로젝트 빌드가 안되는 현상이 발생한다.

4. 그렇다면.

package-lock.json 파일을 들여다 본 사람은 알겠지만 resolved 항목에 패키지를 받아온 주소 또는 ip 가 작성된다

    "node_modules/@babel/code-frame": {
      "version": "7.24.7",
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
      "dependencies": {
        "@babel/highlight": "^7.24.7",
        "picocolors": "^1.0.0"
      },   
      "engines": {
        "node": ">=6.9.0"
      }
    },

따라서 단순하게 이 resolved 항목만 제거해 주면 네트워크에 관계없이 정상적으로 작동되는 프로젝트를 구성할 수 있다.

유닉스 계열 에서는 다음과 같은 명령으로 제거할 수 있다.

cat package-lock.json | sed 's/"resolved":.*$//g' > tmp.json && mv tmp.json package-lock.json

또는 notepad++ 등 정규식이 지원되는 편집기에서 다음과 같이 일괄삭제가 가능하다

Regular expression 체크 후
find 항목에 "resolved":.*
replace 항목은 비워둠

이후 .npmrc 파일만 아래처럼 편집해 주면 nexus repository 주소가 바뀐 경우에도 정상적으로 빌드가 되는것을 확인할 수 있다.

## .npmrc
## registry={넥서스주소를 적어준다}
registry=https://192.168.0.2:9999/repository/npm/
timeout=60000

보통 package-lock.json 파일은 프로젝트 초기에 요구사항에 따라 필요한 프레임워크들을 다양하게 수용 해야 하기에

왕성하게 변화 하다가, 중반쯤 들어서면 거의 변화가 없게 마련이다.

이로서 프로젝트 최초구성은 인터넷이 자유로운 환경에서 구축하고 폐쇄망에 반입하여 정상적으로 사용할 수있다.

(물론 nexus도 그에 맞추어 반입해야 한다.)

넥서스 구축 및 반입 방법은 나중에 한번 다루어 보겠다.

넥서스 구축및 반입방법은 아래 글을 참고하자.

관련글 : Nexus 저장소 를 복사해 보자!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다