Dart:如何在导入的包中指定 Isolate URI?

Dart: how to specify an Isolate URI in an imported package?

我已经写了一些代码,我想在一个包中提供它,但我也想把它作为一个工人暴露给包消费者。为此,我创建了一个包装器 class,它 运行 在内部是一个隔离,并使用发送命令和侦听器与 Isolate 通信以提供功能。

当我想使用 binweb 目录中的包装器 class 时出现问题:提供的 Uri 是从 running/main Isolate 而不是从包根目录。对于 bin,它是 packagename|bin/,对于 web,它是 packagename|web

我想将此 class 导出给消费者,以便他们可以选择一种比构建自己的 Isolate 更简单的方法,但我不确定如何指定主文件在 spawnUri 中使用。

有没有一种方法可以指定文件,因此无论主 Isolate 运行 来自哪里,它总是会被解析为正确的文件。

结构:

// Exports the next file so the class in it will be package visible 
packageroot -> lib/package_exports_code_that_spawns_isolate.dart
// This file should contain URI that always resolve to the next file
packageroot -> lib/code_that_spawns_isolate.dart 
// The main worker/Isolate file
packageroot -> lib/src/worker/worker.dart

谢谢。

要引用包中的库,您应该使用 package: URI。 类似于:

var workerUri = Uri.parse("package:myPackage/src/worker/worker.dart");
var isolate = await Isolate.spawnUri(workerUri,...);

它并不完美,因为它需要您将包名称硬连接到代码中,但我相信这是目前可用的最佳选择。

Isolate.spawnUri 函数不会(也不能)解析相对 URI 引用。调用它的源文件 - Dart 库中的任何内容都取决于调用它的位置,这太脆弱了 - 因此相对 URI 将不起作用。引用您的工作人员的唯一绝对 URI 是 package: URI,因此您必须使用它。