[官网文档翻译]Flutter持久化库moor已更名为drift~ Let's 迁移

1,306 阅读4分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。

Flutter持久化库drift(原moor)官方文档翻译汇总 - 掘金 (juejin.cn)

前言:

之前参加的Flutter项目中用到了持久化库 moor,最近想总结下 moor 相关的用法,然后在 moor 的 pub 上看到了 moor 已更名为 drift 的消息。

moor:

  1. n.  荒野, 旷野
  2. vt. & vi.  停泊, 系泊(船只)
    drift:
  3. n. 漂流,漂移;漂流物;趋势
  4. vi. 漂流,漂移;漂泊
  5. vt. 使…漂流;使…受风吹积

不再停泊了,要开始漂泊了

相关内容简单肉翻了下。

moor 的 pub: moor | Dart Package (pub.dev)

重要通知: moor 已经更名为 drift。该包(moor)会继续被支持一段时间,但是我们仍然鼓励用户迁移到 drift。 帮助切换的自动化工具已经可用。需要更多的信息的话,请查看文档。感谢您的理解。

drift 的 pub: drift | Dart Package (pub.dev)

Moor and Drift

Moor and Drift (simonbinder.eu)

moor 已经更名为 drift。原因是,在这世界的一些地方,moor 被用做不敬的术语。这个项目开始时并不知道这一点,但我们相信现在的名字(moor)也不是反映了 Dart&Flutter 社区的包容性。尽管付出了相关的努力,我还是相信对工程的更名是正确的决定。感谢您的理解。

直到版本 5.0.0, 现在的 moormoor_generator 会继续可用 - 无需任何紧急改动。对于新包 drift 的所有特性和修复都会反映到 moor。到下次不兼容的发布时,moor 将中止维护,以支持 drift drift_dev

本文描述了如何从旧的 moor 包迁移到新的 drift 包。这个过程可以自动化,我们希望对于您来说是分分钟的事儿。如果(自动迁移)工具有问题,本文也描述了如何手动迁移到新的 drift 包。

自动迁移

为了使更名尽可能容易,drift 带来了一个为工程自动迁移的工具。它会分析工程的源码文件,然后进行所有迁移相关的变动。

为了使用迁移工具,首先要确认正在使用 moor_generator 的版本是 4.6.0 或更新,例如更新相关依赖如下:

dev_dependencies:
  moor_generator: ^4.6.0

接下来,确认工程没有分析错误,有分析错误会使迁移工具效率低下。当然,在运行迁移工具前,需要创建一个现在工程文件的备份。因为迁移过程会在没有任何进一步的确认提示的情况下覆盖掉部分代码文件。如果在使用 git,需要确保 git 是 clean 的状态。

执行迁移,需要在工程目录下运行 dart run moor_generator migrate 命令。如果在使用 Flutter,运行 flutter pub run moor_generator migrate 来代替。迁移工具会转换工程的 pubspec、build.yaml文件和 Dart 代码文件。也会将 .moor 文件更名为 .drift 文件,并且按需要修改代码中的 import。

运行迁移之后,请确认下迁移的改动来确保迁移的结果符合预期。

也可能需要做一下以下这些:

  • 重新格式化代码:运行 dart format .flutter format .
  • 重新编译:(Dart工程)运行 dart run build_runner build 或 (Flutter工程)运行flutter pub run build_runner build --delete-conflicting-outputs
  • 手动修改迁移造成的 import 的顺序改变。

祝贺你!你的工程已在使用 drift

如果使用自动移动工具遇到了问题,请开一个 issue

手动迁移

moor 迁移到 drift,可能需要更新以下这些文件:

  • 工程的pubspec
  • Dart 的 import
  • Dart 代码,反映新的 API 名
  • build.yaml 配置文件,如果有的话

新的依赖

首先分别用 drift 的依赖替换 moor 的依赖,用 drift_dev 替换 moor_generator 的依赖。

dependencies:
  drift: ^1.0.1
dev_dependencies:
  drift_dev: ^1.0.2

运行 pub get 获取新的包。

修改 Dart 的 import

下面的表格对比了 moor 的旧的 import 和 drift 的新的 import。

moor importdrift import
package:moor/extensions/json1.dartpackage:drift/extensions/json1.dart
package:moor/extensions/moor_ffi.dartpackage:drift/extensions/native.dart
package:moor/backends.dartpackage:drift/backends.dart
package:moor/ffi.dartpackage:drift/native.dart
package:moor/isolate.dartpackage:drift/isolate.dart
package:moor/moor_web.dartpackage:drift/web.dart
package:moor/moor.dartpackage:drift/drift.dart
package:moor/remote.dartpackage:drift/remote.dart
package:moor/sqlite_keywords.dartpackage:drift/sqlite_keywords.dart

修改 Dart 代码

下面的表格对比了 moor 特有的 API 名和相应的 drift 的 API 名。

moor API 名drift API 名
VmDatabaseNativeDatabase
MoorIsolateDriftIsolate
MoorWebStorageDriftWebStorage
@UseMoor@DriftDatabase
@UseDao@DriftAccessor
MoorWrappedExceptionDriftWrappedException
MoorRuntimeOptionsDriftRuntimeOptions
moorRuntimeOptionsdriftRuntimeOptions
$mrjc and $mrjfUse Object.hash from dart:core
MoorServerDriftServer

(可选:重命名 moor 文件)

为了一致性,可以把 .moor 文件重命名为 .drift 。虽然 drift generator 也会继续接受 .moor 文件。

如果选择了重命名,也需要更新 import 和 include: 在数据库和 DAO 类里使用的参数。

编译配置

如果当前配置了 moor builder 的选项,也需要更新 build.yaml 文件,反映成新的 builder 的键。

moor builder 键drift builder 键
moor_generator|preparing_builderdrift_dev|preparing_builder
moor_generator|moor_generatordrift_dev|drift_dev
moor_generatordrift_dev
moor_generator|moor_generator_not_shareddrift_dev|not_shared
moor_generator|moor_cleanupdrift_dev|cleanup

开始迁移吧。