Logo
Memu
Action
Document Page

兼容性困境

使用过 node.js 相比对下面这张图不会陌生,无它就是依赖太重了,压根不知道到底有多深。随之而来的自然而然的是 node.js 版本管理问题,有一些年久失修的库可能不支持最新的 node 版本,同时不同的 node 对应的 npm 版本也有挺大的差别,里面还设计到 node_modules 的依赖管理问题。

因此一个好用的管理 node 版本的工具就孕育诞生了,它就是 nvm (Node Version Manager),可以非常方便的在不同的 node 版本中进行切换,让你随心所欲的跑项目了。


当然本篇的主角是 Flutter。面对 Flutter 的版本快速迭代,与 pub.dev 库的日益增长,许多库受到维护者精力限制,没办法及时跟进 Flutter 的迭代步骤。这其中比较痛苦的一个过程就是迁移到 null-safety,虽然 Flutter 方便迁移的 cli 使用,但是奈何许多的库不支持,因此迁移的过程也是挺曲折的。

当然这些还只是小问题,更多遇到的则是使用旧版本开发的 Flutter 应用。当我需要在本地运行的时候,非常沮丧的发现,它需要比较旧版本的 Flutter,例如 2.8.1、2.5.3 之类的。而我的本级环境虽然没能跟上最新的 Flutter Stable 版本,但好得也升到了 2.10.1。这就造成了:1. 临时降级;2. 再装一个旧版本。

Flutter 升降级

Flutter 的安装基本是都是以 Git 的形式进行的,所以你可以直接在 Flutter 安装目录下进行 Git Tag 的切换,进而切换 Flutter 的版本 (例如分支)。Flutter cli 也是通过切换 Git Tag 来完成的升降级,所以你可以简单的在 Flutter 目录下面执行:



切换完成后还需要执行 flutter doctor,之后会自动下载指定版本的相关产物,完成相关的构建工作。


此方法虽然可以简单切换 Flutter 的版本,但是每次的切换都会重新下载构建许多东西,速度方面一点都没有优势,有时候我们只是简单的想跑几个 Demo 而已。

多 Flutter 管理

为了避免来回切换版本带来的开销,另一种方式自然是安装多个 Flutter 版本,然后统一管理,和 nvm 模式一样,但是它叫:fvm


来看一下安装方式(以 macOS 为例):


有 brew 的加持安装起来还是非常简单的,不需要额外的配置步骤。


还有另外一张方式是作为一个 pub 库来安装

这里需要你已经有 Flutter 环境才可以(至少也要 dart 环境)


选择安装需要的版本

这里以 kraken 项目为例,官方支持最高的 Flutter 版本是 2.8.1,因此我们就安装这个版本。



安装完成后,你可以通过 fvm list查看安装的目录:


fvm 安装的 Flutter 就存在这个目录下面,要方便使用的话还需要额外配置一下目录。


这里以 vscode 为例:

打开“settings.json”配置文件,添加一下新字段:


之后 vscode 就可以检测到当前安装的 Flutter SDK 版本了,可以通过:“Flutter: Change SDK”进行切换。

cli 配置

虽然 IDE 使用的 Flutter 版本已经配置完成,但是在控制台输入 flutter --version 可以发现我们依旧使用的是之前版本的 Flutter,这个时候如果想要全局使用某一个版本的 Flutter,可以如下:

这个时候 fvm会在安装目录下面创建一个 default文件夹,链接到指定版本的 Flutter 目录下面:

这里我选择了 2.10.5这个版本,因此可以看到路径中出现了 versions/2.10.5的信息。但是这个时候一般是无法正常使用的,因为我们之前还安装过一个 Flutter 版本,为了能正常使用需要配置一下 PATH 环境变量,让 fvm指向的路径处于一个比较优先的位置,这样我们就能全局使用指定版本的 flutter了,是不是非常方便?

📌 备注

由于我是直接通过 homebrew安装的 Flutter 因此,这里我选择自己通过 brew remove flutter 将之前安装的版本给删掉了哈哈,以后统一使用 fvm进行管理,比较方便。

总结

通过 fvm 可以方便快捷的安装不同版本的 Flutter,让你面对旧项目的时候游刃有余。但是总体来说,还是能使用新版本就上新的版本,因为新的版本往往带来性能等方面的提升。

Footer