새 맥북 개발 환경 세팅: git clone이 가져오지 않는 것들
맥북을 새로 받고 하던 프로젝트를 이어서 하려 했습니다. 리포를 클론하고 npm install 을 돌린 다음 개발 서버를 띄웠는데, 브라우저에 이게 떴습니다.
Module not found: Can't resolve '@/generated/prisma/client'
1 | import { PrismaPg } from "@prisma/adapter-pg";
> 2 | import { PrismaClient } from "@/generated/prisma/client";저는 처음에 코드가 깨진 줄 알았습니다. 경로 별칭 설정이 잘못됐거나, 누가 파일을 지우고 커밋했거나. 그런데 이 리포는 며칠 전 컴퓨터에서 멀쩡히 돌던 것이고 그 사이 아무도 손대지 않았습니다.
같은 커밋, 같은 코드인데 한쪽에서만 안 됩니다. 그러면 문제는 코드가 아니라 코드 밖에 있습니다.
없던 것은 코드가 아니라 생성물
원인은 .gitignore 한 줄이었습니다.
/src/generated이 프로젝트는 Prisma 클라이언트를 src/generated/prisma 로 뽑아 쓰는데, 그건 스키마에서 만들어 내는 산출물이라 커밋하지 않습니다. 옛 컴퓨터에는 언젠가 prisma generate 를 돌린 결과가 남아 있었습니다. 새 컴퓨터에는 없습니다. npm install 은 이걸 만들어 주지 않습니다.
npm run db:generate # prisma generate한 줄로 끝났습니다. 문제는 이걸 알아내는 데 걸린 시간이 아니라, 에러 메시지가 원인을 전혀 가리키지 않았다는 점입니다. Module not found 는 import 문제처럼 읽힙니다. 실제로는 빌드 파이프라인의 한 단계를 건너뛴 것이었습니다.
다른 프로젝트에서 또 난 같은 일
Expo 앱 쪽으로 넘어가니 비슷한 게 또 있었습니다. ios/ 와 android/ 디렉터리가 통째로 없었습니다.
이것도 의도된 것이었습니다. Expo 의 CNG(Continuous Native Generation) 방식은 네이티브 프로젝트를 설정 파일에서 매번 새로 만들어 쓰고, 그래서 .gitignore 에 들어가 있습니다.
npx expo prebuild --platform ios패턴이 같습니다. 리포에는 만드는 방법만 들어 있고 만든 결과는 안 들어 있습니다. 옛 컴퓨터에서 안 겪은 이유는 그 결과물이 이미 거기 있었기 때문이지, 그 컴퓨터가 특별해서가 아니었습니다.
있는데 안 보이는 도구
iOS 빌드를 걸려니 이번엔 다르게 막혔습니다.
$ xcodebuild -version
xcodebuild: error: ...
$ swift --version
Apple Swift version 6.3.3Swift 는 답하는데 xcodebuild 는 없다고 합니다. Xcode 를 App Store 에서 이미 받아 뒀는데도 그랬습니다. 원인은 macOS 의 활성 개발자 디렉터리 설정이 Xcode 가 아니라 Command Line Tools 를 가리키고 있던 것이었고, 이건 따로 글로 정리했습니다.
여기서 얻은 건 분류 하나입니다. "없는 것"과 "안 보이는 것"은 증상이 비슷한데 고치는 방법이 전혀 다릅니다. 앞의 둘은 명령을 돌려 만들어 내면 되고, 이건 설정을 고쳐야 합니다. 없는 줄 알고 재설치를 시작하면 시간만 버립니다.
리포가 알려주지 않는 시스템 패키지
node_modules 는 package.json 이 목록을 들고 있습니다. 리포를 클론하면 무엇이 필요한지 알 수 있고, 명령 하나로 다 받습니다.
시스템 쪽은 그런 게 없습니다. 이번에 없어서 막힌 것들입니다.
| 필요한 것 | 증상 | 리포에 목록이 있나 |
|---|---|---|
| CocoaPods | iOS prebuild 가 Pod 설치 단계에서 멈춤 | 없음 |
| JDK | Unable to locate a Java Runtime |
없음 |
| Android SDK | ANDROID_HOME 미설정, adb 없음 |
없음 |
CocoaPods 는 brew install cocoapods 로 1.17.0 을 받아 해결됐습니다. Android 쪽은 JDK 와 SDK 와 환경변수까지 세 겹이라 아직 손대지 않았습니다.
이건 리포의 잘못이 아닙니다. 이 도구들은 프로젝트에 속한 게 아니라 머신에 속합니다. 다만 그래서 어디에도 적혀 있지 않습니다. 옛 컴퓨터의 이 목록은 몇 달에 걸쳐 필요할 때마다 하나씩 깔면서 만들어진 것이고, 만든 사람조차 전체 목록을 모릅니다.
리포에 있지만 열쇠가 없던 비밀
가장 오래 막힌 건 이쪽입니다.
이 프로젝트는 환경변수를 암호화해서 리포에 커밋합니다. 값이 전부 암호문이라 커밋해도 안전하고, 복호화 개인키만 따로 보관합니다. 그래서 클론하면 설정 파일 38개 키가 통째로 따라옵니다. 읽을 수만 없을 뿐입니다.
열쇠는 비밀번호 관리자에 있었습니다. 옛 컴퓨터에는 그 파일이 이미 있었으니 몇 달 동안 그 존재를 잊고 지냈습니다.
계정 로그인도 같은 종류입니다. 클라우드 빌드를 걸려니 이렇게 나왔습니다.
$ npx eas-cli whoami
Not logged in설정도 프로젝트 ID도 전부 리포에 들어 있어서 준비는 끝나 있는데, 로그인 하나가 없어서 아무것도 안 됩니다. Xcode 의 Apple 계정도 마찬가지고요.
비슷한 증상, 네 종류의 원인
정리하고 보니 막힌 것 전부가 네 갈래로 갈렸습니다.
| 종류 | 이번에 걸린 것 | 고치는 방법 |
|---|---|---|
| 생성물 | node_modules, Prisma 클라이언트, ios/ |
명령을 돌려 만든다 |
| 머신 전역 설정 | 활성 개발자 디렉터리 | 설정을 고친다 |
| 시스템 패키지 | CocoaPods, JDK, Android SDK | 설치한다 |
| 비밀과 계정 | 복호화 개인키, 빌드 서비스 로그인, Apple 계정 | 다른 곳에서 가져온다 |
위에서 아래로 갈수록 리포가 도와주는 정도가 줄어듭니다. 첫 줄은 리포가 방법까지 들고 있고, 둘째 줄은 증상조차 오해를 부르고, 셋째 줄은 목록이 아예 없고, 마지막 줄은 리포 안에 있으면 안 되는 것들입니다.
새 컴퓨터가 느리게 느껴지는 이유가 이겁니다. 마지막 두 줄은 검색해서 나오는 게 아니라 기억해 내야 합니다.
다음 맥에서 다르게 할 것
이번에 겪고 나서 하나는 확실해졌습니다. 옛 컴퓨터가 "다 되던" 상태였던 게 아니라, 몇 달치 설치와 로그인이 쌓여 있던 것뿐입니다. 그 목록은 아무 데도 없었고 새 기계에서 하나씩 다시 부딪히며 복원됐습니다.
그래서 리포에 셋업 문서를 하나 두려고 합니다. 클론 직후에 돌려야 하는 명령, 필요한 시스템 패키지, 어떤 계정에 로그인해야 하는지. 특히 세 번째가 중요합니다. 이번에 빌드 서비스 계정이 리포의 GitHub 계정과 다르다는 걸 다시 확인하느라 문서를 뒤져야 했습니다.
다만 이 문서가 실제로 유지될지는 확신이 없습니다. 새 기계를 세팅하는 일은 몇 년에 한 번이라 문서가 낡을 시간이 충분하고, 실제로 이 프로젝트의 배포 문서는 이미 낡아 있었습니다. 여섯 항목을 "아직 안 함"으로 적어 뒀는데 그중 다섯은 진작 끝나 있었습니다. 낡은 체크리스트는 없는 것보다 나쁠 수도 있습니다.
지금으로선 자동으로 검증되는 것만 문서에 적는 쪽이 낫겠다고 생각하고 있습니다. 사람이 지켜야만 최신인 목록은 결국 안 지켜집니다.
함께 읽기
- Watchman은 React Native 개발에서 왜 필요할까React Native나 Expo로 개발하다 보면 코드를 고쳤는데 앱에 바로 반영되지 않는 경우가 있습니다. 이때 원인 중 하나가 파일 변경 감시 도구인 Watchman 문제일 수 있습니다.
- xcode-select와 DEVELOPER_DIR: 어느 쪽이 정석일까?Expo 앱을 iOS 시뮬레이터에 띄우려고 도구부터 점검했는데, 결과가 앞뒤가 안 맞았습니다.
- code 명령: PATH에 없을 때 등록하는 두 가지 방법터미널에서 VS Code로 뭔가를 열려고 code .을 쳤는데 command not found: code가 떴습니다. VS Code는 이미 깔려 있었습니다. /Applications/Visual Studio Code.app에 앱 자체는 멀쩡히 있었고, 문제는 그 앱을 실행하는 code 명령이 PATH 어디에도 없다는 것…
- macOS 클립보드 관리자, Swift·Tauri·Electron 중 무엇으로 만들까?클립보드 관리자를 만들겠다고 하면 첫 질문은 대개 "UI를 뭘로 짤까"입니다. React가 익숙하면 Electron이나 Tauri, 네이티브가 좋으면 SwiftUI를 떠올립니다. 그런데 이 앱의 화면은 검색창 하나와 목록 하나가 거의 전부입니다. 나머지는 운영체제와 주고받는 일입니다.
- Tauri 2로 클립보드 관리자를 만들면 네이티브 코드는 얼마나 남을까?지난 글에서 저는 클립보드 관리자를 Tauri로 만들면 가장 어려운 부분이 결국 네이티브 코드로 남는다고 썼습니다. 그 뒤 실제로 Tauri 2로 CopyFocus라는 클립보드 관리자를 만들었습니다. 결과부터 말하면 예상은 절반만 맞았습니다. 직접 짠 네이티브 코드는 생각보다 훨씬 적었고, 대신 예상하지 못한 곳에서 운…