【问题标题】:Dart: how to specify an Isolate URI in an imported package?Dart:如何在导入的包中指定 Isolate URI?
【发布时间】:2016-05-08 17:54:31
【问题描述】:

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

当我想从binweb 目录使用这个包装类时,就会出现问题:提供的Uri 是从运行/主目录Isolate 而不是从包根目录插入的。对于bin,它是packagename|bin/,对于web,它是packagename|web

我想将这个类导出给消费者,这样他们就可以选择一种比构建自己的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

谢谢。

【问题讨论】:

    标签: dart dart-isolates


    【解决方案1】:

    要引用包中的库,您应该使用package: URI。 比如:

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

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

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

    【讨论】:

    • 这确实适用于服务器上的 DartVM,有没有办法让它在 Dart2JS 中也能工作(解析的 Uri (package:pkgname/worker/worker.dart) 解析为 localhost:8080 (在 Datrium 中也是如此)...
    猜你喜欢
    • 2019-08-03
    • 2023-03-28
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多