2016-05-08 2 views
4

Я написал код, и я хочу предоставить его в пакете, но я хочу также разоблачить его, чтобы упаковать потребителей в качестве рабочего. Для этого я создал класс-оболочку, который выполняет внутреннюю изоляцию и использует команду send, а слушатели общаются с Isolate для обеспечения функциональности.Dart: как указать изолированный URI в импортированном пакете?

Проблемы возникает, когда я хочу использовать этот класс обертки из bin или web каталога: 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 

Спасибо.

ответ

2

Чтобы обратиться к библиотеке в вашем пакете, вы должны использовать URI package:. Что-то вроде:

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

Это не идеально, потому что она требует от вас жесткий провод ваше имя пакета в коде, но я считаю, что это лучший вариант в настоящее время.

Функция Isolate.spawnUri не позволяет (и не может) разрешить относительную ссылку URI по адресу. исходный файл, который его вызвал - ничто в библиотеках Dart не зависит от того, откуда он вызван, это слишком хрупко, поэтому относительный URI не будет работать. Единственный абсолютный URI, ссылающийся на вашего рабочего, - это package: URI, так что вы должны использовать.

+1

Это действительно работает в DartVM на сервере, есть ли способ заставить его работать и в Dart2JS (проанализированный Uri (пакет: pkgname/worker/worker.dart) разрешает http: // localhost: 8080/(в Datrium) ... –

 Смежные вопросы

  • Нет связанных вопросов^_^