티스토리 뷰

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
댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday