Expo fastlane failed: exit code 65 - React Native

손완서·2022년 8월 21일
0

TroubleShooting

목록 보기
2/3

서론

Expo 빌드에 실패했다.
ios 빌드 커맨드를 실행하면 expo.dev에서 빌드 현황을 확인할 수 있다.
ipa 파일 빌드 과정 중 마지막에 fastlane을 통한 CI 테스트가 있다.
이 과정에서 에러가 발생했고, 빌드에 실패했다.

에러 이유

많이 찾아봤지만, ios build 과정에서 이 글에 따르면 exit code 65가 출력되는 경우는 data format이 잘못되어 있다는 매우 추상적인 에러 케이스였다.
결국 직접 디버깅을 하다가, 터미널에 찍히는 경고문을 보고 이유를 파악했다.

과정

기존에 내 프로젝트에서는 한 문제가 있었다.
모바일 애플리케이션에 DID 관련 연산을 해야 하는 경우가 있어, 해당 라이브러리를 설치했다.
라이브러리를 import 하려고 할 때, 에러가 발생했다.
'cjs 파일을 resolve할 수 없다'는 에러 내용이었다.

expo 프로젝트를 생성하면 @expo/metro-config가 자동으로 설정된다.

여기서 잠깐, metro란 무엇일까?

Full name은 Metro Bundler이다.
이름에서 알 수 있듯이 Bundler이다.
Metro Bundler는 Babel을 이용하여 자바스크립트 코드를 컴파일한 후 해당 코드를 Mobile Application에서 동작할 수 있게 해준다.
브라우저와 모바일에서 동작하는 자바스크립트 엔진에는 동작 방식의 차이가 있기 때문에 일부 경우 호환되지 않을 수 있다.
(대표적으로 async/await이 있다.)

또한 Expo Application에게 Asset 파일을 제공해준다.
Asset 파일이 캐싱되어 있지 않아 최초로 접근하는 경우, Metro Bundler가 해당 Asset 파일의 URL을 제공해준다.

해당 metro-config 파일을 자세히 들여다보면, sourceExts라는 값이 있다.
이 값은 해당 애플리케이션에서 resolve할 수 있는 소스코드의 확장자가 명시되어 있다.
기본 값은 ['js', 'jsx', 'json', 'ts', 'tsx']이다.

그리고 src/ExpoMetroConfig.ts 파일의 187번째 line에는 다음과 같은 코드가 작성되어 있다.

if (isExotic) {
  // Add support for cjs (without platform extensions).
  sourceExts.push('cjs');
}

isExotic 값이 true라면 sourceExts에 cjs를 push한다.
이 코드를 확인하고 바로 metro-config의 getDefaultConfig 함수에 modee 옵션을 추가했다.
실행했을 때 unstable feature라고 생각했지만, 실행이 잘 되고 기존에 발생하던 문제가 해결되어 크게 대수롭지 않게 여겼다.

이번에 expo build 과정에서 오류가 발생하고 디버깅을 하는 과정에서 exotic mode가 문제였다는 것을 알게 되었다.

다시 경고문을 제대로 읽어보니 다음과 같았다.
exotic mode는 아직 실행 초기 단계이고, 불아정한 기능이다. 번들링이 예상처럼 동작하지 않을 수 있다.

나는 exotic mode의 cjs import하는 기능만 있으면 됐기에 metro-config 코드를 약간 수정하여 해결했다.
수정된 코드는 다음과 같다.

const { getDefaultConfig } = require('expo/metro-config');

const defaultConfig = getDefaultConfig(__dirname);

defaultConfig.resolver.sourceExts.push('cjs');

module.exports = defaultConfig;

정상적으로 동작했다.

반성의 시간

Terminal에 친절하게 출력되던 경고문을 제대로 읽지 않아서 발생한 문제였다..
안일했던 대처가 나의 2시간을 갉아먹었다.

Unstable한 Feature를 Product에서 실행한 것도 문제였다.
다음부터는 Test Version의 Feature를 사용할 때는 조심해서 주의깊게 사용해야겠다.

profile
프론트엔드 개발자

0개의 댓글