我有一个简单的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
是否有办法获取当前正在运行的脚本的绝对路径,无论其执行方式如何?
答案 0 :(得分:2)
tl; dr:没有一种很好的方法可以做你想做的事,但它正在进行中。
“正在运行的脚本的路径”的概念比第一次脸红时听起来更复杂。 Dart生态系统可以通过多种方式调用main()
。在我的头顶,这里有几个:
dart
手动运行文件。main()
,并在子进程或隔离中运行该脚本。在某些情况下,“正在运行的脚本”实际上是一个包装器,而不是您创作的原始文件。在其他情况下,它是一个快照,可能没有创建它的文件的固有知识。在其他情况下,文件已被变换器修改,并且正在运行的实际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文件很容易。