npm run ios 에러 해결기

이전부터 리액트 네이티브 프로젝트에서 ios 시뮬레이터를 실행시키면 절대 한번에 실행되는 법이 없었다. 그래서 그때도 어떻게 에러를 해결했는지 기록해놨었는데, 그걸 참고해도 실행이 안되더라는😂 그래서 또 다시 작성한다. npm run ios로 스트레스 받지 않는 그날을 위해
1. pod install
깃에서 프로젝트를 받고 npm run ios
를 하기 전 pod install
(프로젝트에 필요한 라이브러리 설치)을 했다. 하지만 언제나 여기부터 막혔었다. 항상 다른 이유로..😇 이번에는 아래와 같은 에러가 떴다
rbenv: pod: command not found
The `pod' command exists in these Ruby versions:
2.7.5
3.2.2
pod 명령어를 사용할 수 없다는 것은
1. cocoaPod가 제대로 설치되지 않았거나
2. ruby 환경이 제대로 설정되지 않은 경우다.
iOS의 의존성 관리 도구인 CocoaPods는 루비에 의해 개발되었으므로 루비 환경에서 작동한다. 에러 문구로 루비 버전과 관련된 것이 떴으므로 로컬의 루비 버전을 확인해보았다. 정확히 기억나지 않지만 저 두 버전은 아니었으므로 루비 버전을 바꾸어주었다.
CocoaPods
는 RubyGems(루비에서 사용하는 패키지 관리자. node.js의 npm)에 등록된 많은 패키지 중 하나다. 그래서 제일 처음 코코아패드를 설치할 때gem install cocoapods
로 설치를 했을 것이다.
rbenv global 3.2.2 # 시스템 전체에서 기본적으로 사용할 루비 버전 변경
rbenv rehash # 해당 버전에 맞게 갱신
rbenv local 3.2.2 # 프로젝트 폴더에 루비버전이 설정되어 있다면 로컬로 버전 변경
rbenv rehash
pod --version # CocoaPods 설치 확인
루비 3.2.2로 버전을 변경한 후 pod install
을 하니까 아래와 같이 에러가 떴다.
[!] Invalid Podfile file:
[!] Invalid RNGestureHandler.podspec file: undefined method `exists?' for [File:Class](File:Class).
루비 3.2.2에서는 File.exists?
메소드가 유효하지 않으므로 File.exist?
메소드를 사용하라고 한다.node_modules/react-native-gesture-handler/RNGestureHandler.podspec
파일에서 File.exists?
를 File.exist?
로 수정하고 pod install을 했다. 하지만 동일한 에러 발생…
하지만 나는 동일한 프로젝트 파일을 여러 개 받아놓고 이것저것 시도해보면서 에러를 해결하고 있었는데, 다른 파일에서 루비 버전을 2.7.5로 설치했을 때 pod install이 성공했었다. 정석적인 에러 해결 방법은 아니지만 다시 rbenv local 2.7.5
로 루비 버전 변경 완 ^^
잘 설치되는 듯 하다가 또 아래와 같은 에러가 떴다.
[!] Error installing boost
Verification checksum was incorrect, expected f0397ba6e982c4450f27bf32a2a83292aba035b827a5623a14636ea583318c41, got 79e6d3f986444e5a80afbeccdaf2d1c1cf964baa8d766d20859d653a16c39848
이 에러를 구글링을 했을 때 boost.podspec
파일의 'https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2'
를 'https://archives.boost.io/release/1.76.0/source/boost_1_76_0.tar.bz2'
로 변경했더니 해결되었다는 글을 보고 적용했더니 성공했다..! 🎉
해당 에러는 체크썸(파일이나 데이터가 전송되는 과정에서 손상 또는 변경되었는지 사용)의 불일치인데, 다운로드를 하고 보니 체크썸이 일치하지 않아서 변경해야된 것이 아닐까싶다.
2. npm run ios - podfile 수정
드디어 pod install이 작동되었고 npm run ios
를 했다. 당연히 바로 성공하지 않았고요.
빌드중이라고 돌아가더니 로그가 한 5억줄 찍혔다. 에러는 아래와 같이 나왔지만 로그 상단에 다른 에러들도 많았다.
BUILD FAILED
The following build commands failed:
CompileC /Users/…/Library/Developer/Xcode/DerivedData/App-csubxcbigzkboqcppnqqkwlxtozs/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/Yoga.build/Objects-normal/arm64/Yoga.o /Users/…/node_modules/react-native/ReactCommon/yoga/yoga/Yoga.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler (in target 'Yoga' from project 'Pods')PhaseScriptExecution [CP]\ Copy\ XCFrameworks /Users/…/Library/Developer/Xcode/DerivedData/App-csubxcbigzkboqcppnqqkwlxtozs/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/Ads-Global.build/Script-46EB2E000298E0.sh (in target 'Ads-Global' from project 'Pods')
(2 failures)
사실 이런 에러들이 뜨면 pod install을 다시 하라던지, DerivedData를 삭제하라던지, 빌드 캐시를 삭제하라던지 이런 얘기들이 많다. 캐시 삭제를 몇 번을 하고 pod install도 수 없이 했으나 여전히 똑같았고, gpt한테 갖다받치니 Flipper를 비활성화 해보라고 하심.
Flipper는 리액트 네이티브 디버깅 툴인데, 리액트 네이티브 레이아웃 엔진(라이브라리)인 Yoga와 충돌 가능성이 있다고 한다. 그래서 ios/Podfile
에서 아래와 같이 Flipper 관련 코드를 비활성화 했다.
# use_flipper!()
그 후 pod install
- npm run ios
를 했더니 에러 하나가 삭제됨! 웃긴 게 요가랑 충돌할 수 있다고 해서 삭제했는데 두번째 에러가 삭제되었다. 소 뒷걸음질치다 에러잡기🫠
3. npm run ios - Xcode 확인
(아래의)남은 에러는 도저히 모르겠어서 Xcode에서 확인해보기로 했다.
The following build commands failed:
CompileC /Users/.../Library/Developer/Xcode/DerivedData/App-csubxcbigzkboqcppnqqkwlxtozs/Build/Intermediates.noindex/Pods.build/Debug-iphonesimulator/Yoga.build/Objects-normal/arm64/Yoga.o /Users/.../node_modules/react-native/ReactCommon/yoga/yoga/Yoga.cpp normal arm64 c++ com.apple.compilers.llvm.clang.1_0.compiler (in target 'Yoga' from project 'Pods')
(1 failure)
Xcode 무사와요.. 리액트 네이티브를 쓰면서 Xcode는 빌드 에러 날때만 실행해봐서 그런지 그냥.. 모르겠는.. 어떤 것이었다. 암튼, 여기서 빌드를 실행했더니
- 에러 1) 요가 파일에서 아래의 에러가 떴다.
Fix
클릭해서 수정하고 다시 빌드 → 해결
- 에러 2) RCT-Folly에서 아래와 같은 에러가 떠서 픽스 클릭 후 빌드 → 해결
에러 3) 두 개의 에러가 떴다.
그러니까 저 구글어쩌구는 arm64(디바이스용)에서만 빌드가 가능하다. 하지만 나는 iOS 시뮬레이터로 빌드를 진행중이기 때문에 충돌이 발생한다. 그래서 arm64를 Excluded Architectures에 설정해줘야한다. 그런데 arm64를 제외시키면 프로젝트가 실행이 되긴 하는건가? 라는 의문이 들었는데, 해당 파일은 시뮬레이터에서는 실행이 안되는 채로 빌드가 되는 듯 하다.
- Xcode에서 변경 : 프로젝트 파일의 Build Settings에서 Excluded Architectures에 arm64를 넣어준다. 나의 경우 i386을 arm64로 수정해줬다.
- Podfile 수정 : podfile에 아래 코드를 추가해준다.
config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
이후 에러3은 뜨지 않았으나 다른 에러가 떴고, 이것저것 시도해보다 아래와 같은 에러가 났다.
해결할 의지를 상실해벌임
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
4. 다시 돌아가서 podfile
다음날 다시 여러 개의 프로젝트 파일 중 하나로 갈아 타서…
구글링과 지피티의 콜라보로 해결책을 얻었다. 주석 처리했던 pod install의 flipper를 아래와 같이 변경하고 pod install
- npm run ios
를 했더니
use_flipper!({ 'Flipper' => '0.185.0' }) # 최신 버전으로 변경
??? 성공했어요
filpper 없애는 것이 아니라 최신 버전으로 수정했더니 빌드가 되었다…..🥹
실패를 너무 많이 했더니 성공하더라도 어안이 벙벙한…
-
암튼 이렇게 ios 빌드를 성공시켰다! 시뮬레이터는 항상 빌드하기 전에 부담을 가지고 있었는데(이러한 과정들을 거쳐야하기에) 그래도 이번에 에러들을 하나씩 뜯어보면서 정리를 해놔서 다음에는 부담이 덜할 것 같다. 안드로이드 스튜디오나 Xcode의 사용법에 대해서는 아직 미숙한데 이들도 부담 가지지 말고 차근차근 공부를 시작해봐야겠다.
Subscribe to my newsletter
Read articles from 화영 directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
