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

Pet*_*StJ 5 dart dart-isolates

我已经编写了一些代码,并且希望在程序包中提供它,但是我也想将它作为工作人员提供给程序包使用者。为此,我创建了一个包装类,该包装类在内部运行隔离,并使用send命令,并且侦听器与隔离通信以提供功能。

当我要从binweb目录使用此包装器类时,就会出现问题:所Uri提供的是从运行目录/主目录的目录Isolate而不是软件包根目录插入的。因为bin它是packagename|bin/,因为web它是packagename|web

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

有没有一种方法可以指定文件,因此无论从何处运行主隔离,它都将始终解析为正确的文件。

结构体:

// 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
Run Code Online (Sandbox Code Playgroud)

谢谢。

lrn*_*lrn 2

要引用包中的库,您应该使用package:URI。就像是:

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

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

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