티스토리 뷰
Flutter GetX 패키지를 사용하고 있는데, 그중에 모듈을 자동으로 생성해주는 get_cli를 잘 사용하고 있다.
그런데 어느 날 갑자기 아래와 같은 에러가 나왔다.
Synchronous waiting using dart:cli waitFor and C API Dart_WaitForEvent
is deprecated and disabled by default. This feature will be fully removed
in Dart 3.4 release. You can currently still enable it by passing
--enable_deprecated_wait_for to the Dart VM.
See https://dartbug.com/52121
원인
Dart가 동기 대기(waitFor) API를 제거하는 과정에서 생긴 문제다. 이 API는 비동기 코드를 동기처럼 기다리게 해주는 기능이었는데, 데드락과 예측 불가능한 동작을 유발해서 Dart 팀이 폐기하기로 결정했다.
get_cli 내부가 이 API에 의존하고 있어서, Dart를 올리는 순간 CLI가 실행되지 않는 것이다.
선택지 정리
당시 정리했던 선택지는 이랬다. 해결 방법은 get_cli가 패치를 하든지, flutter를 다운그레이드하는 방법이 있다.
- Flutter 다운그레이드 — 말도 안 되는 것이다. 다른 패키지들과 호환이 깨진다
- get_cli 패치를 기다린다 — 내가 어찌 할 수 없는 것이다
그래서 임시 해결 방법을 찾아 공유했다.
해결: 패치된 포크 버전 사용
flutter pub global activate --source=git https://github.com/inyong1/get_cli.git
커뮤니티에서 패치한 포크를 직접 설치하는 방식이다. --source=git 옵션으로 pub.dev가 아닌 Git 저장소에서 바로 설치할 수 있다.
되돌리려면
# 공식 버전으로 복귀
flutter pub global activate get_cli
# 아예 제거
flutter pub global deactivate get_cli
# 현재 설치된 전역 패키지 확인
flutter pub global list
임시로 플래그를 켜는 방법
에러 메시지에 나온 대로 Dart VM 플래그로 기능을 되살릴 수도 있다.
dart --enable_deprecated_wait_for run get_cli:main
다만 이건 Dart 3.4에서 완전히 제거됐으므로 지금은 통하지 않는다. 임시방편이었을 뿐이다.
이런 상황에서 일반적으로 쓰는 대응
특정 패키지가 SDK 업데이트를 못 따라올 때 쓸 수 있는 선택지들이다.
- 포크 버전 사용 — 위 방법. 가장 빠르지만 신뢰할 수 있는 포크인지 확인이 필요하다. 남의 저장소를 전역 설치하는 것이므로 코드를 한 번 훑어보는 게 좋다
- fvm으로 SDK 버전 분리 — 프로젝트별로 Flutter 버전을 다르게 쓴다. 레거시 프로젝트를 유지보수해야 할 때 유용하다
- 직접 PR 보내기 — 이슈가 이미 올라와 있고 수정이 간단하면 직접 고치는 게 빠를 때도 있다
- 도구를 걷어낸다 — get_cli는 결국 보일러플레이트 생성기다. 없어도 개발은 된다. 템플릿을 직접 만들어 쓰는 것도 방법이다
전역 CLI 패키지의 함정
이번 일을 겪고 나서 든 생각인데, pub global activate로 설치하는 도구들은 관리 사각지대에 있다.
- 프로젝트의
pubspec.yaml에 안 남는다. 팀원이 같은 환경을 재현하기 어렵다 - 버전이 로컬마다 다르다. 생성되는 코드가 사람마다 달라질 수 있다
- CI에서 따로 설치해야 한다. 잊어버리면 빌드가 깨진다
그래서 코드 생성기라면 가능하면 dev_dependencies에 넣고 dart run으로 실행하는 방식이 낫다. 버전이 lock 파일에 박히기 때문이다.
# 프로젝트 의존성으로 관리
dart run build_runner build
# 전역 설치가 아니라 프로젝트에 고정된 버전이 실행된다
정리
- Dart가
dart:cli waitFor를 폐기하면서 get_cli가 실행 불가 - Flutter 다운그레이드는 현실적이지 않다
flutter pub global activate --source=git로 패치된 포크 설치- 포크를 쓸 때는 코드를 한 번 확인할 것
- 전역 CLI는 재현성이 떨어진다. 가능하면
dev_dependencies로
'개발 > Dart & Flutter' 카테고리의 다른 글
| [Android] 스토어 배포 경고 (디버그 기호 업로드) (0) | 2024.07.09 |
|---|---|
| Flutter 안드로이드 타겟 SDK 대응하기 (targetSdkVersion 경고) (4) | 2024.07.09 |
| IntelliJ / Android Studio에서 생성 파일 묶어 보기 (File Nesting) (0) | 2023.04.22 |
| Flutter 안드로이드 빌드 전에 해두면 좋은 설정들 (0) | 2023.02.28 |
| Flutter 추천 라이브러리 (0) | 2023.02.17 |
댓글
