static String get _pathToCurrentScript {
if (_current == null) {
final script = Platform.script;
String _pathToScript;
if (script.isScheme('file')) {
_pathToScript = Platform.script.toFilePath();
if (_isCompiled) {
_pathToScript = Platform.resolvedExecutable;
}
} else {
/// when running in a unit test we can end up with a 'data' scheme
if (script.isScheme('data')) {
final start = script.path.indexOf('file:');
final end = script.path.lastIndexOf('.dart');
final fileUri = script.path.substring(start, end + 5);
/// now parse the remaining uri to a path.
_pathToScript = Uri.parse(fileUri).toFilePath();
}
}
return _pathToScript;
} else {
return _current.pathToScript;
}
}
static bool get _isCompiled =>
basename(Platform.resolvedExecutable) ==
basename(Platform.script.path);
import 'package:stack_trace/stack_trace.dart' as stacktrace;
/// Returns an absolute path to the caller's `.dart` file.
String currentDartFilePath() => stacktrace.Frame.caller(1).uri.toFilePath();
/// Returns a path to the caller's `.dart` file, relative to the package root.
String currentPackageRelativePath() => stacktrace.Frame.caller(1).library;
4条答案
按热度按时间vwoqyblh1#
如果您正在为基于控制台的应用执行此操作(例如,在单元测试中),并打算使用输出来打开文件进行阅读,则使用
Platform.script.path
会更有帮助:该命令的结果可以与
File
对象一起使用,并且可以被打开/读取(例如,如果您有一个需要读取/比较样本数据的单元测试,或者一个需要打开与当前脚本相关的文件的控制台程序)。hiz5n14c2#
查找脚本目录的最简单方法是使用路径包。
将路径包放入pubspec.yaml:
并且一定要运行
pub get
来下载和链接路径包。xqkwcwgp3#
使用Platform.script.path并不是在所有情况下都有效。
如果脚本是作为单元测试编译或运行的,则不会得到预期的结果。
这来自dcli项目(https://pub.dev/packages/dcli)
如果您使用的是dcli,可以拨打:
或
如果脚本是通过dart运行的<scriptname.dart>,如果您编译了脚本或者如果您的脚本是一个单元测试,那么这段代码就可以工作。
下面是内部实现。
nle07wnf4#
确定当前
.dart
文件路径的另一种方法(虽然很笨拙)是从堆栈跟踪中提取路径。与
Platform.script.path
不同,这应该适用于单元测试:请注意,
stacktrace.Frame.caller(1)
返回 caller 的堆栈帧,因此上面的代码期望您调用currentDartFilePath()
currentPackageRelativePath()
,而不是直接使用stacktrace.Frame.caller(1).uri.toFilePath()
或stacktrace.Frame.caller(1).library
。如果只需要目录,则可以对结果执行典型的路径操作。