5

私はいくつかのコードを書いており、それをパッケージで提供したいのですが、それをワーカーとしてパッケージ コンシューマーにも公開したいと考えています。この目的のために、Isolate を内部で実行し、send コマンドとリスナーを使用して Isolate と通信して機能を提供するラッパー クラスを作成しました。

binまたはwebディレクトリからこのラッパークラスを使用したいときに問題が発生します。提供されたものは、パッケージルートからではなく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

ありがとう。

4

1 に答える 1

2

パッケージ内のライブラリを参照するには、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 であるため、それを使用する必要があります。

于 2016-05-10T07:16:52.940 に答える