모노레포의 node_modules 한번에 지우기

첫번째 포스트를쓰고 언 6개월.. 그사이 인생에있어서 큰이벤트인 결혼과 집관련 문제로 여러 잔스트레스가 쌓여 블로깅에 소홀했다..

그동안 포스팅할 주제는 생각해왔지만 오랜만에 쓰는 글이기에 좀 가벼운 내용으로 시작해보려 한다!!

vite로 번들러를 변경함과 동시에 모노레포로 전환했기에 시기는 좀 되었다. client, widget, util 총 3개의 레포를 관리하고 있는데, 패키지 재설치할 일이 많지 않다보니, 별 생각없이 node_modules 제거를 각 레포마다 rm -rf를 하고있었다.

하지만 최근 패키지 정리 및 버전관리를 하면서 node_modules를 지웠다 설치했다 할 일이 많았었는데 정말 여간 귀찮은게 아니어서 간단한 node script를 만들었다.

const fs = require('fs');

const deleteNodeModules = () => {
    const NODE_MODULES = 'node_modules';

    const paths = {
        root: './' + NODE_MODULES,
        client: './packages/client/' + NODE_MODULES,
        chat_widget: './packages/chat_widget/' + NODE_MODULES,
    };

    for (const name in paths) {
        try {
            const path = paths[name];
            fs.accessSync(path);

            fs.rm(path, { recursive: true, force: true }, (err) => {
                if (err) {
                    console.log(`${name}의 node_modules를 지우는데 문제가 생겼습니다.`, err);
                    return;
                }
                console.log(`DELETE - [${name}] node_modules`);
            });
        } catch (err) {
            console.log(`${name}의 node_modules이 존재하지 않습니다.`);
        }
    }
};

각 모노레포 경로를 객체로 만들어 순회한다, 레포가 3개밖에 없으니 동기식으로 작동하는 accessSync 메서드를 써주고, 파일이 있냐없냐만 체크하면 되니 두번째 매개변수의 권한은 fs.constants.F_OK 지만 기본값이므로 생략해 주었다.

파일이 존재하지 않다면 catch문으로 이동해 로그를 띄우게 되고, 존재한다면 rm -rf와 유사한 동작을 하는 rm + { recursive: true, force: true }을 이용해 제거해준다.

해당 스크립트의 실행은 아래와 같이 한다.

"delete" : "node -e \'require('./scripts.js').deleteNodeModules()\'"

모노레포 root디렉토리안에 scripts.js라는 파일이 존재한다. 프로젝트 세팅과 관련된(호스트 파일 세팅 등) 유틸 함수들도 별도로 스크립트로 만들었기때문에 -e 옵션으로 script.js를 실행해서 해당함수만 가져와서 실행해준다.

하지만 window환경에서 해당 스크립트가 실행이 안됐는데, 이유는 작은따옴표에 있었다.

window와 unix 기반 시스템간 작은따옴표 처리방식이 달라서 그럴 수 있다고 해 아래와 같이 바꾼후 정상 동작됐다.

"delete" : "node -e \"require('./scripts.js').deleteNodeModules()\""

부족한 내용이지만, 팀원들의 인식하지 못하는 불편함을 하나 제거했다는 생각에 나름 뿌듯하다 😂