Dart pub全局运行无法解析脚本名称

时间:2016-01-25 00:12:12

标签: dart

我有一个简单的dart项目,在bin文件夹(test.dart)中有一个可执行文件。我已经使用dart global activate激活了它,现在只需输入该可执行文件的名称就可以直接运行它。

在dart文件中我想知道该脚本的路径。基本上现在我只是打印这样的东西:

print('1: ' + Platform.script.toString());
print('2: ' + Platform.script.path);
print('3: ' + Platform.executable);
print('4: ' + Platform.packageRoot);
print('5: ' + Platform.resolvedExecutable);

当我直接运行时:

test

或与pub:

pub global run test

或甚至包名:

pub global run test:test

我总是得到相同的结果:

1: http://localhost:53783/test.dart
2: /test.dart
3: E:\apps\dart-sdk\bin\dart
4:
5: E:\apps\dart-sdk\bin\dart.exe

这里的问题是我无法获得test.dart文件的绝对路径。

当我像这样运行时:

dart /path/to/project/bin/test.dart

我得到了我需要的东西:

1: file:///E:/projects/dart/test/bin/test.dart
2: /E:/projects/dart/test/bin/test.dart
3: dart
4:
5: E:\apps\dart-sdk\bin\dart.exe

是否有办法获取当前正在运行的脚本的绝对路径,无论其执行方式如何?

2 个答案:

答案 0 :(得分:2)

tl; dr:没有一种很好的方法可以做你想做的事,但它正在进行中。

“正在运行的脚本的路径”的概念比第一次脸红时听起来更复杂。 Dart生态系统可以通过多种方式调用main()。在我的头顶,这里有几个:

  • 使用dart手动运行文件。
  • 在隔离区中运行文件。
  • 将文件编译为快照,然后手动运行或在隔离区中运行它。
  • 自动将文件编译为缓存的可执行文件,并在子进程或隔离文件中运行该文件。
  • 添加一个包装脚本,用于导入文件并调用main(),并在子进程或隔离中运行该脚本。
  • 通过HTTP提供文件,并在子进程或隔离中运行它。

在某些情况下,“正在运行的脚本”实际上是一个包装器,而不是您创作的原始文件。在其他情况下,它是一个快照,可能没有创建它的文件的固有知识。在其他情况下,文件已被变换器修改,并且正在运行的实际Dart代码根本不在磁盘上。

我怀疑你实际上在寻找的不是可执行网址本身,而是包文件的位置。我们正在开发一系列能够实现这一目标的API,以及一个resource包,它将为处理您的包的资源提供一个很好的API。

在那之前,你可以使用dart:mirrors黑客。如果您为其中一个库文件提供显式库标记,例如library my.cool.package,则可以写:

var libPath = currentMirrorSystem().findLibrary(#my.cool.package).uri.path;

这将为您提供库的路径,您可以使用它来确定包的lib/个文件所在的位置。

答案 1 :(得分:1)

如果您想在function now { date -u +%T } export -fx now 中运行时以可靠的方式访问当前文件,则需要使用镜像。

以下是pub次测试的示例用法 - https://github.com/dart-lang/dartdoc/blob/41a5e4d3f6e0084a9bc2af80546da331789f410d/test/compare_output_test.dart#L17

dartdoc

不是特别漂亮,但只是放入一个util文件很容易。