4

我正在编写一个从lib目录加载附加数据的包,并希望提供一种简单的方法来加载这些数据,如下所示:

const dataPath = 'mypackage/data/data.json';

initializeMyLibrary(dataPath).then((_) {
  // library is ready
});

我制作了两个独立的库browser.dartstandalone.dart,类似于在Intl包中的完成方式。

从“浏览器”环境中加载这些数据很容易,但是在“独立”环境中,由于pub run命令的原因,就不是那么容易了。

当脚本使用 simple 运行时,我可以使用dart:io.Platform和属性$ dart myscript.dart找到包路径。 Platform.scriptPlatform.packageRoot

但是当脚本运行时$ pub run tool/mytool,加载数据的正确方法应该是:

  • 从 pub run 命令检测脚本是否正在运行
  • 找到发布服务器主机
  • 从这个服务器加载数据,因为可能有 pub 转换器,我们不能直接从文件系统加载数据。

即使我想直接从文件系统加载数据,当脚本运行时pub runPlatform.script返回/mytool路径。

那么,问题是有什么方法可以找到正在运行的脚本pub run以及如何找到 pub 服务器的服务器主机?

4

1 回答 1

4

我不确定这是正确的方法,但是当我使用 运行脚本时pub runPackage.script实际上返回http://localhost:<port>/myscript.dart. 因此,当方案为 时http,我可以使用 http 客户端下载,当方案为 时file,从文件系统加载。

像这样的东西:

import 'dart:async';
import 'dart:io';
import 'package:path/path.dart' as ospath;

Future<List<int>> loadAsBytes(String path) {
  final script = Platform.script;
  final scheme = Platform.script.scheme;

  if (scheme.startsWith('http')) {
    return new HttpClient().getUrl(
        new Uri(
            scheme: script.scheme,
            host: script.host,
            port: script.port,
            path: 'packages/' + path)).then((req) {
      return req.close();
    }).then((response) {
      return response.fold(
          new BytesBuilder(),
          (b, d) => b..add(d)).then((builder) {
        return builder.takeBytes();
      });
    });

  } else if (scheme == 'file') {
    return new File(
        ospath.join(ospath.dirname(script.path), 'packages', path)).readAsBytes();
  }

  throw new Exception('...');
}
于 2014-10-18T09:55:10.870 回答