4

ディレクトリから追加のデータをロードするパッケージを作成しており、次のlibような方法でこのデータをロードする簡単な方法を提供したいと考えています。

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

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

Intlパッケージで行われているのと同様に、2 つの別個のライブラリbrowser.dartとを作成しました。standalone.dart

このデータを「ブラウザ」環境からロードするのは非常に簡単ですが、「スタンドアロン」環境にな​​ると、pub runコマンドのせいでそれほど簡単ではありません。

スクリプトが simple で実行されている場合、dart:io.Platformとプロパティ$ dart myscript.dartを使用してパッケージ パスを見つけることができます。 Platform.scriptPlatform.packageRoot

しかし、スクリプトが で実行されている場合、$ pub run tool/mytoolデータをロードする正しい方法は次のようになります。

  • pub run コマンドからスクリプトが実行されていることを検出する
  • パブサーバーホストを見つける
  • pub トランスフォーマーが存在する可能性があり、ファイル システムから直接データをロードできないため、このサーバーからデータをロードします。

また、ファイル システムから直接データをロードしたい場合でも、スクリプトを で実行するとpub run、パスPlatform.scriptが返され/mytoolます。

では、スクリプトが実行されpub runていることを確認する方法と、pub サーバーのサーバー ホストを見つける方法はありますか?

4

1 に答える 1

4

これが正しい方法かどうかはわかりませんが、 を使用してスクリプトを実行するとpub runPackage.script実際には が返されますhttp://localhost:<port>/myscript.dart。したがって、スキームが の場合はhttphttp クライアントを使用してダウンロードでき、 の場合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 に答える