[Issue]Yarn berry 사용할때 node_modules가 없을 때

승환·2025년 2월 3일
0

개요

최근 같은 이슈를 겪은 사람들과 문제를 해결한 이야기를 기록하기위해 작성합니다.

기존의 yarn 3이상을 사용시 yarn classic 이 아닌 yarn berry 를 사용하는데 yarn berry의 경우 Plug'n'Play(PnP)라는 기술을 기본적으로 사용합니다.
PnP모드를 사용 할 시에 node_modules 를 사용하지 않습니다.
때문에 node_modules에 의존성을 가진 코드와 충돌이 발생 할 수 있습니다.

해당 글은 yarn berry 또는 PnP모드에 관한글이 아닌 yarn berry 사용 시 링커설정을 PnP모드에서 기존의 클래식처럼 node_modules를 사용하는 방법을 작성합니다.

yarn에 대한 세부 내용은 리멤버 개발블로그 를 참조해주세요

Case1

Vercel에서 모노레포 툴링으로 Turborepo의 경우 패키기 매니저중 pnpm의 pnp모드만을 지원하고, yarn berry의 경우 지원을 하지않습니다.

Case2

react-native에서 새 프로젝트를 시작하고 ios의 pod install 을 실행할시 다음과 같은 error 로그를 볼 수 있습니다.

# 실행 코드(Podfile)
def node_require(script)
  # Resolve script with node to allow for hoisting
  require Pod::Executable.execute_command('node', ['-p',
    "require.resolve(
      '#{script}',
      {paths: [process.argv[1]]},
    )", __dir__]).strip
end

# error 코드
Error: Cannot find module 'react-native/scripts/react_native_pods.rb'
Require stack:
- /Users/user/Documents/sources/AwesomeProject/ios/[eval]
    at Module._resolveFilename (node:internal/modules/cjs/loader:1077:15)
    at Function.resolve (node:internal/modules/cjs/helpers:127:19)
    at [eval]:1:9
    at Script.runInThisContext (node:vm:123:12)
    at Object.runInThisContext (node:vm:299:38)
    at node:internal/process/execution:79:19
    at [eval]-wrapper:6:22
    at evalScript (node:internal/process/execution:78:60)
    at node:internal/main/eval_string:28:3 {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/Users/user/Documents/sources/AwesomeProject/ios/[eval]' ]
}

기본적으로 작성 된 Podfile def node_require 부분이 실행 될때 참조하고자 하는 node_modules가 없어서 에러를 반환하고 있습니다. 해당 코드를 수정하는게 아니라면 기존과 같이 node_modules를 추가해야 합니다.

해결

yarn set version berry

  • yarn set version berry를 root project 터미널에 입력
  • 그후 .yarnrc.yml 이 생성됩니다.
  • 해당 파일에서 nodeLinker가 nodeLinker: node-modules 로 되어있는지 확인하고 없다면 추가해주면 됩니다.
nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.6.0.cjs

토막 정보

yarnrc는 yarn의 내부 설정을 관리하는 파일입니다.

  • yarnPath: yarn을 프로젝트 내에 설치하는데 가장 선호되는 방법으로 모든 팀원이 같은 yarn version을 사용할 수 있도록 해줍니다.
  • nodeLinker: Node 패키지를 설치하는데 어떤 링커를 사용할지 명시하는 속성. (pnp, pnpm ,node-modules 가능)

출처: https://nukw0n-dev.tistory.com/37 [찐이의 개발 연결구과:티스토리]

profile
반갑습니다~

0개의 댓글

관련 채용 정보