有一种方法可以获取当前正在执行的脚本的路径,然后找到相对于此位置的资源文件,但是不能保证发布应用程序时目录结构是相同的。

Dart是否提供一种与pub runpub global run一起使用的加载资源(文件,数据等)的通用方法?

问另一种方式,如何在运行时在Dart应用程序中动态加载package: URI的内容?

最佳答案

更新
resource软件包已发布。

更新
这是重做的。 Resource类将被移动到一个包中。

原始

Dart中有一个新的Resource类(已通过Dart VM version: 1.12.0-edge.d4d89d6f12b44514336f1af748e466607bcd1453 (Fri Aug 7 19:38:14 2015)测试)

resource_example / lib / resource / sample.txt

Sample text file.

resource_example / bin / main.dart
main() async {
  var resource = const Resource('package:resource_example/resource/sample.txt');
  print(await resource.readAsString());
  // or for binary resources
  // print(await resource.readAsBytes());
}

执行中
dart bin/main.dart

版画
Sample text file.

执行中
pub global activate -spath .
pub global run resource_example:main

也打印
Sample text file.

也可以将变量的内容作为资源传递。例如,这可能在单元测试中方便传递模拟资源。
const sampleText = "Sample const text";

main() async {
  var uriEncoded = sampleText.replaceAll(' ', '%20');
  var resource = new Resource('data:application/dart;charset=utf-8,$uriEncoded');
  print(await resource.readAsString());
}

还支持任意文件或http uris,但在使用相对路径时使用pub runpub global run时,这可能不起作用。
main() async {
  var uri = new Uri.file('lib/resource/sample.txt');
  var resource = new Resource(uri.toString());
  print(await resource.readAsString());
}

有关更多详细信息,请参见
-http://blog.sethladd.com/2015/08/dynamically-load-package-contents-with.html
-https://codereview.chromium.org/1276263002/

09-30 13:52
查看更多