expo 프로젝트를 EAS를 사용해 빌드하기
https://docs.expo.dev/build/setup/
문서 중간에 Configure the project 챕터에서 환경변수를 쓴다면 build configuration에 그것들을 넣으라고 한다.
그리고 링크를 따라 들어가서 읽어보았다.
내가 이해한 바로는 로컬에서 빌드를 할 때는 .env에서 환경 변수를 사용하고 빌드를 할 때는 eas.json에서 설정한 환경 변수를 쓰라고 한다. 그러면 똑같은 변수를 두번 적는거 아닌가? 중복이 생기는게 괜찮은가? 라고 생각할 수 있는데 괜찮다고 한다.
However, the recommended practice is to use .env files in your local environment, while defining environment variables for EAS Build in eas.json. Environment variables defined in your eas.json build profile will be used when evaluating your app.config.js when running eas build and will be available to all steps of the build process on the EAS Build server.
This may result in some duplication of variables between .env files and eas.json build profiles, but makes it easier to see what variables will be applied across all environments.
그런데 내가 설정했던 환경 변수는 app.config.js에서 설정하고 expo-constants 라이브러리를 사용해서 코드 안에서 쓰는 방식이었다. 위 문서에서 내가 했던 것과 제일 비슷해보이는 파트를 보면, 문서에선 eas.json에서 설정한 환경변수를 사용해서 app.config.js에서 환경변수를 동적으로 설정하고 있다. 🔗
그런데 설명에서 eas.json에 있는 환경변수는 app.config.js를 evaluating할 때 사용 가능하다고 하는데 evaluating한다는게 뭔지 와닿지 않는다.
All environment variables in your eas.json build profile are available when evaluating app.config.js.
GPT에게 물어보았다.
여기서 “evaluating”이라는 용어는 “평가하다” 또는 “해석하다”라는 의미로 사용됩니다. 구체적으로, app.config.js 파일을 실행하거나 처리하는 과정에서, eas.json에 정의된 환경 변수들이 해당 파일 안에서 사용될 수 있다는 것을 의미합니다.
그렇다면 app.config.js에서 이미 환경 변수를 설정했으면 괜찮은거 아닐까 생각해서 그냥 바로 빌드하기로 했다.
그리고 sentry auth token은 eas secrets에 등록해두었다.🔗
eas build -p android --profile preview
를 하니까
CommandError: You're currently using the bare workflow, where runtime version policies are not supported. You must set your runtime version manually. For example, define your runtime version as "1.0.0", not {"policy": "appVersion"} in your app config. https://docs.expo.dev/eas-update/runtime-versions
bare workflow에서는 런타임 버전을 직접 설정해줘야 한다고 한다. 버전 관리를 semantic versioning으로 메이저 마이너 패치로 나눠서 하고 하는 내용을 들었는데 실제로 하려고 하니까 막막해서 일단 제일 처음이니 1.0.0으로 설정해주었다.
그리고 다시 빌드를 돌리고 expo 대시보드에서 Builds를 보니 잘 되었다!

그런데 한가지 실수를 한 것이 빌드를 할 때 APP_MODE를 넣어주지 않은 것이다.

그래서 BASE_URL이 로컬 url로 들어가는 것이었다. 그래서 그런가 apk를 설치해서 실행하면 계속 로컬 서버를 켜라는 안내 문구가 나왔었다.
APP_MODE를 eas.json에도 환경 별로 설정해서 넣어주었다.
//eas.json
{
"cli": {
"version": ">= 10.0.2"
},
"build": {
...
"preview": {
"extends": "production",
"distribution": "internal",
"android": {
"buildType": "apk"
},
"channel": "preview",
"env": {
"EXPO_PUBLIC_APP_MODE": "development"
}
},
그리고 app.config.js에서 process.env.EXPO_PUBLIC_APP_MODE가 development인지 production인지에 따르는 조건문을 추가해주었다.
그리고 다시 빌드하니까 문제없이 앱도 실행이 되었다! 그런데! 구글 로그인 버튼을 누르니까 invalide client 에러가 발생했다. 이건 보안을 위해 서버에서 받아오는 androidClientId에서 잘못된 것이라고 생각되어 로컬에서 빌드하여 로그를 찍어보니 내가 서버에서 객체로 받아온 값을 androidClientId 변수에 그대로 넣어주고 그걸 구글 로그인 함수에 그대로 전달하고 있던 것이었다. 그래서 객체에서 값을 추출해서 넣어주었더니 문제가 없어졌다. 이 변경사항을 방금 빌드한 apk에 반영하고 싶다. 그러기 위해 EAS Update를 해야한다!
그외 빌드하면서 본 경고 문구
Your project archive is 296 MB. You can reduce its size and the time it takes to upload by excluding files that are unnecessary for the build process in .easignore file. Learn more
⠼ Uploading to EAS Build (140 MB / 296 MB)
내 프로젝트 아카이브가 296메가라는데 프로젝트 아카이브가 뭘까
GPT 답변
프로젝트 아카이브(Project Archive)는 EAS (Expo Application Services)에서 빌드를 생성하기 위해 업로드하는 프로젝트의 압축 파일입니다. 이 파일은 프로젝트의 모든 소스 코드, 설정 파일, 이미지 및 기타 리소스 등을 포함하고 있습니다. EAS 서버는 이 아카이브를 사용하여 Android 또는 iOS 앱을 빌드합니다.
하지만, 프로젝트에는 빌드에 필요하지 않은 불필요한 파일들이 포함될 수 있습니다. 예를 들어, 로컬 개발 환경에서만 필요한 파일들, 테스트 데이터, 로그 파일, 또는 특정 폴더(예: node_modules 중 일부)를 포함할 수 있습니다. 이러한 불필요한 파일들은 프로젝트 아카이브의 크기를 크게 만들고, 업로드 및 빌드 시간을 증가시킬 수 있습니다.
.easignore 파일은 이러한 불필요한 파일들을 프로젝트 아카이브에서 제외할 수 있도록 하는 파일입니다. 이는 .gitignore와 유사한 방식으로 동작하며, 빌드 과정에서 필요하지 않은 파일이나 폴더를 명시하여, 아카이브 크기를 줄이고 업로드 및 빌드 시간을 단축하는 데 도움을 줍니다.