첫번째 포스트를쓰고 언 6개월.. 그사이 인생에있어서 큰이벤트인 결혼과 집관련 문제로 여러 잔스트레스가 쌓여 블로깅에 소홀했다..
그동안 포스팅할 주제는 생각해왔지만 오랜만에 쓰는 글이기에 좀 가벼운 내용으로 시작해보려 한다!!
모노레포로 프로젝트 전환 이후 node_modules 관리
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()\""
부족한 내용이지만, 팀원들의 인식하지 못하는 불편함을 하나 제거했다는 생각에 나름 뿌듯하다 😂