yarn berry를 도입한 서비스를 운영하며 알아가는 내용을 정리해나가고자 한다.
1. nodeLinker: pnp
yarn berry는 .pnp.cjs 파일로 패키지를 관리하기 때문에 기본적으로 node_modules가 존재하지 않는다. 그런데 yarn2 –> yarn3 버전업 후 install 시 .pnp.cjs가 제거되는 문제가 생겼다.
.yarnrc.yml 파일에는 의존성 관리 방식을 결정하는 nodeLinker
속성이 있다. 이를 node_modules
로 설정하면 yarn1처럼 의존성을 node_modules 폴더로 관리하고, 속성을 사용하지 않거나 pnp
로 설정하면 .pnp.cjs 파일로 관리한다. 문서 참고
기존 프로젝트에는 nodeLinker 속성이 없어서 기본값이 pnp
였을텐데 버전업 후 생긴 이슈라 명확한 이유는 찾지 못하고 직접 명시하여 해결하였다.
.yarnrc.yml
nodeLinker: pnp
2. Cannot find module …
VSCode와 yarn berry, Typescript를 사용하면서 모듈을 찾지 못하는 상황이 있었다. 문서에 따르면 IDE에서 pnp 의존성 관리를 할 때 Typescript가 작동하도록 추가적인 구성이 필요하다고 한다.
현재 VSCode를 사용하고 있어서 아래처럼 설정하였고 다른 IDE 구성 명령도 문서에서 확인할 수 있다.
yarn dlx @yarnpkg/sdks vscode
3. yarn node
커밋 메시지 템플릿을 생성하는 commit-msg.js 스크립트를 작성하고 이를 husky .commit-msg로 실행했는데 Error: Cannot find module 'shelljs'
에러가 났다. 스크립트에서 사용하는 shelljs 모듈을 찾지 못했다.
node ./scripts/git-hooks/commit-msg.js
shelljs 호환 문제인가 삽질을 하다가.. 이유를 찾았는데 명령어 문제였다. pnp로 의존성 관리를 할 때에는 yarn node
명렁어를 사용해야 한다.
yarn node ./scripts/git-hooks/commit-msg.js
자세한 내용은 이 글을 참고하였다.
Yarn은 Node.js가 제공하는
require()
문의 동작을 덮어씀으로써 효율적으로 패키지를 찾을 수 있도록 합니다. 이 때문에 PnP API를 이용하여 의존성 관리를 하고 있을 때에는node
명령어 대신yarn node
명령어를 사용해야 합니다.