用fvm管理多个Flutter SDK

本文总结了Flutter Explained关于fvm的视频: https://youtu.be/R6vKde1vIGQ

background

flutter有很多channel: stable/beta/dev/master, 而目前有些功能只在某个channel上可用, 比如Linux support目前只在dev channel支持.

我日常用的是beta channel, 但是想写Linux程序时每次flutter channel dev的话 需要花费很多时间--因为要下载新channel的内容, switch回去的时候又要等半天(因为要从新下载).

fvm这正是解决这个问题的! 它可以cache不同版本的flutterSDK, 每个repo可以设置使用不同的版本号, 而且VSCode也只需要简单配置就能上手.

enable fvm

一行命令即可开启fvm: $ pub global activate fvm

常用法:

  • fvm flutter: Proxies flutter commands 用于选择合适的flutter版本
  • 也就是说用fvm flutter来代替flutter命令 — 会自动pick当前repo所用的SDK
  • 比如: fvm flutter doctor
  • fvm list: 查看目前安装的flutter 版本
  • fvm use: 选择使用一个SDK版本
  • fvm install dev/beta/stable/...: 安装SDK

use fvm

在flutter文件夹里运行fvm use xxx即可

$ cd my_flutter_proj
$ fvm use dev
$ fvm list
Versions path:  /home/xwei/fvm/versions
beta
dev ✔

这个会在当前目录下添加一个.fvm的文件夹, 里面包含了到指定SDK的软链接 以及一个json config:

$ ls .fvm
flutter_sdk@  fvm_config.json

接下来就可以愉快的用flutter dev开发linux app了1.

$ fvm flutter config --enable-linux-desktop
$ fvm flutter devices
2 connected devices:
Android SDK built for x86 (mobile) • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)
Linux (desktop)                    • linux         • linux-x64   • Linux
$ fvm flutter create .
$ fvm flutter run -d linux

VScode config

cf. https://github.com/leoafarias/fvm#vscode 让vscode使用fvm flutter (而不是默认flutter), 只要修改settings.json把那个flutter_sdk的软链接即可:

$ cat .vscode/settings.json 
{
  "dart.flutterSdkPaths": [".fvm/flutter_sdk"]
}

然后在VSCode的command palette里输入Flutter: Change SDK, 就可以选择flutter SDK了

other config

change cache path

fvm默认cache在~/fvm文件夹下, 可以修改FVM_HOME环境变量改到别的位置. cf. https://github.com/leoafarias/fvm#change-fvm-cache-directory

bash/fish alias

每次都写fvm flutter有点麻烦 可以在bashrc/config.fish里加上一行 alias ff=fvm flutter

综上, 只需要在.bashrc里加上:

alias ff='fvm flutter'
export FVM_HOME="$HOME/.local/fvm"

我一般用fish, 是在config.fish里加上:

alias ff='fvm flutter'
set FVM_HOME "$HOME/.local/fvm"

  1. Flutter 2.0以后stable channel也可以开发linux, 不过切换channel的需求还是一直在的, 所以还是建议每个flutter项目都使用fvm. 

comments powered by Disqus