최근 같은 이슈를 겪은 사람들과 문제를 해결한 이야기를 기록하기위해 작성합니다.
기존의 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에 대한 세부 내용은 리멤버 개발블로그 를 참조해주세요
Vercel에서 모노레포 툴링으로 Turborepo의 경우 패키기 매니저중 pnpm의 pnp모드만을 지원하고, yarn berry의 경우 지원을 하지않습니다.
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
.yarnrc.yml
이 생성됩니다.nodeLinker: node-modules
로 되어있는지 확인하고 없다면 추가해주면 됩니다.nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.6.0.cjs
yarnrc는 yarn의 내부 설정을 관리하는 파일입니다.
pnp
, pnpm
,node-modules
가능)출처: https://nukw0n-dev.tistory.com/37 [찐이의 개발 연결구과:티스토리]