flutter 개발을 하다보면 다음과 같은 상황에서 불편함을 경험하게 됩니다.
- flutter 버전이 서로 다른 프로젝트를 동시에 개발 참여하게 되어 flutter SDK 가 두 개 이상 설정이 필요합니다.
- 새로운 SDK 버전이 출시되어 이를 테스트 해보거나 기존 SDK 로 롤백하는 작업이 있을 수 있고 이런 일이 빈번하게 필요할 수 있습니다.
- 프로젝트에 참여하는 각 개발자간 flutter SDK 버전이 모두 동일하지 않은 상황을 겪을 수 있습니다. (= 동일한 코드인데 실행 결과가 다름)
flutter SDK 버전을 변경하는 것은 보통 아래와 같은 방법으로 진행합니다.
flutter SDK 는 환경변수로 설정된 경로에 단일 버전으로 관리되기 때문에, 위에서 나열한 상황들이 발생할 때마다 위 작업을 실행하는 것은 시간이 많이 필요하고 번거롭습니다.
- flutter SDK 는 github repository 에서 관리되고 있으며 특히 채널(master / stable / beta) 간 전환속도가 느립니다.
- flutter SDK 버전을 변경할 때 마다 재설치 및 삭제 작업이 필요합니다. 사용하는 SDK 버전들을 설치하고 각 프로젝트에 버전별로 설정하는것이 개발 환경 구성 측면에서 좀 더 효율적일 수 있습니다.
따라서, flutter 로 개발된 각 프로젝트 마다 flutter SDK 버전을 명시해두고 개발을 할 수 있으면 위의 불편함을 해소할 수 있고, 각 프로젝트의 Flutter SDK 버전 추적이 가능해 집니다.
이러한 불편함을 해소하기 위해 사용 가능한 도구는 크게 fvm 과 fenv 가 있습니다. 두 가지 도구 모두 기본적으로 flutter SDK 버전을 여러개 다운로드 받아서 각 flutter 프로젝트 별로 내부에서 symbolic link 를 생성하여 원하는 flutter SDK 버전을 사용하도록 지원합니다. 기본적인 동작방식은 동일하지만, 좀 더 살펴보면 미묘한 차이가 있습니다. (각 도구의 설치 방법이나 상세 사용 방법은 링크를 참조하세요.)
Environments
환경변수는 다음과 같습니다.
- fvm — ‘$HOME/.pub-cache/bin/fvm’
- fenv — ‘$HOME/.fenv/bin/fenv’
flutter SDK 설치 경로는 fenv 의 경우 숨김 폴더로 구성되어 있습니다.
- fvm — ‘$HOME/fvm/versions/{version_name}’
- fenv — ‘$HOME/.fenv/versions/{version_name}’
Flutter 프로젝트에 flutter SDK 설정 완료되면 다음과 같이 심볼릭 링크가 생성되고, 현재 프로젝트가 어떤 flutter SDK 버전을 사용하는지 정의하는 파일이 프로젝트 경로에 생성됩니다.
Commands
각 도구를 사용하기 위한 커맨드는 다음과 같습니다. 도구 사용을 위한 커맨드는 눈에띄는 차이가 없습니다.
하지만, Flutter 커맨드를 사용할때는 fvm 는 proxy command 형식을 차용하고 있고 fenv는 flutter 명령어를 그대로 사용합니다.
Setup SDK Path in IDE
Flutter 개발을 위해 사용되는 IDE 는 보통 VSCode 또는 Android Studio 가 활용되는데요, 각 IDE 별 flutter SDK Path 변경은 아래와 같이 가능합니다.
- Android Studio > Preferences > Languages & Frameworks > Flutter > SDK Path Update
- Project structure > Create
.vscode/settings.json
file > Add 'dart.flutterSdkPath' key & actual flutter sdk path
fvm 의 경우 Android Studio 및 VSCode 모두 SDK 설정을 변경해줘야 하지만, fenv 는 VSCode 를 사용하고 있다면 SDK Path 설정을 변경할 필요가 없습니다. 이는 VSCode 내부에서 default flutter SDK Path 를 `.flutter` 로 정의하기 때문입니다. settings.json > `dart.flutterSdkPath: null` 로 선언해도 정상적으로 동작됩니다.
Conclusion
fvm 은 현재 많은 프로젝트에서 사용이 되고 있어 안정적인 장점이 있습니다. 하지만 개발 경험 측면에서는 fenv 가 더 좋다고 생각합니다. 기존에 CI/CD 가 구성된 프로젝트에 적용하기에도 유연하게 대체 가능하고(=flutter 명령어를 그대로 사용 가능하므로) VSCode 와의 궁합도 좋습니다. flutter SDK 버전 관리에 고민이 되는 분들께 도움이 되면 좋겠습니다.